概述

#

TextInputClient 介面新增一個 currentTextEditingValue 欄位,以從平臺客戶端獲取可編輯文字欄位的當前值。

背景

#

TextInputClient 類由 Flutter 框架用來與平臺程式碼就 EditableText 等文字輸入小部件的當前狀態進行通訊。

當 Android 應用進入後臺時,平臺端可能會丟失其狀態。在此更改後,應用可以向框架請求最後已知狀態。為了獲取此資訊,TextEditingValue 已被暴露給 TextInputClient

變更說明

#

在某些支援的平臺上,應用程式可以進入後臺,預期會消耗更少的資源。例如,後臺執行的 Android 應用程式應避免消耗不必要的記憶體,並且不需要保留對檢視的引用。在此更改之前,當應用重新回到前臺時,特定於 Android 的平臺程式碼可能會丟失可編輯文字欄位的狀態資訊。例如,這會發生在 TextField 小部件中輸入的文字丟失於 Java 程式碼,但仍被 Dart 程式碼記住的情況。

在此更改後,平臺端現在會發送一個名為 TextInput.requestExistingStatetextInput 通道訊息。這會通知 Dart 程式碼,當應用喚醒時,它應該重新建立任何文字輸入連線,並將其最近已知編輯狀態通知平臺。

TextInput 類使用 TextInputClient 介面與客戶端小部件進行互動。該介面以前沒有提供對客戶端當前值的任何洞察。為了允許 TextInput 類適當地響應 TextInput.requestExistingState,在 TextInputClient 中添加了一個名為 currentTextEditingValue 的新 getter。您不能安全地使用傳遞給 TextInputConnection.setEditingState 的最後一個值,因為客戶端僅在特定情況下呼叫該方法,例如當 Dart 程式碼直接修改 TextEditingController 的值,並且該修改不直接反映平臺對按鍵輸入事件的響應的原生處理方式。例如,TextInputFormatter 通常就是這樣工作的,或者當 Dart 程式碼直接設定 TextEditingController.value 時也會發生這種情況。

遷移指南

#

如果您之前實現了 TextEditingClient 或擴充套件了它,您現在必須新增對 currentTextEditingValue 的相應覆蓋。

此值可能為 null。

如果您想在更改合併到程式碼庫之前進行遷移,可以在您的類中新增一個類似以下的類:

dart
abstract class _TemporaryTextEditingClient {
  TextEditingValue get currentTextEditingValue;
}

這允許您在更改合併到框架之前,使用 @override 註釋新增新成員。之後,您可以刪除臨時介面定義。

遷移前的程式碼

dart
class _MyCustomTextWidgetState extends State<MyCustomWidget> implements TextEditingClient {
  ...

  @override
  void updateEditingValue(TextEditingValue value) {
    ...
  }

  @override
  void performAction(TextInputAction action) {
    ...
  }

  @override
  void updateFloatingCursor(RawFloatingCursorPoint point) {
    ...
  }
}

遷移後的程式碼

dart
class _MyCustomTextWidgetState extends State<MyCustomWidget> implements TextEditingClient {
  ...

  @override
  TextEditingValue get currentTextEditingValue => widget.textEditingController.value;

  @override
  void updateEditingValue(TextEditingValue value) {
    ...
  }

  @override
  void performAction(TextInputAction action) {
    ...
  }

  @override
  void updateFloatingCursor(RawFloatingCursorPoint point) {
    ...
  }
}

時間線

#

釋出版本: 1.16.3
穩定版本: 1.17

參考資料

#

API 文件

相關議題

相關 PR