跳至主要內容

TextInputClient currentTextEditingValue

摘要

#

TextInputClient 介面中新增一個欄位 currentTextEditingValue,以從平台客戶端取得可編輯文字欄位的目前值。

背景

#

Flutter 框架使用 TextInputClient 類別與平台程式碼溝通關於文字輸入小工具(如 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