<

TextInputClient の currentTextEditingValue

まとめ

フィールドを追加し、currentTextEditingValue、へTextInputClient編集可能なテキストフィールドの現在の値を取得するインターフェース プラットフォームクライアントから。

コンテクスト

TextInputClientクラスは Flutter フレームワークによって使用され、 テキストの現在の状態についてプラットフォーム コードと通信する のような入力ウィジェットEditableText

Android アプリが実行されると、プラットフォーム側で状態が失われる可能性があります。 背景に移動します。この変更により、 アプリはフレームワークに最後の既知の状態を問い合わせることができます。 この情報を取得するには、 のTextEditingValueのために浮上したTextInputClient

変更内容の説明

サポートされている一部のプラットフォームでは、アプリケーションを次の場所に移動できます。 消費リソースの削減が期待できる背景。 たとえば、Android 上のバックグラウンド アプリケーションは、 不要なメモリが不要になり、ビューへの参照を保持する必要がなくなります。 この変更が行われる前は、Android 固有のプラットフォーム コードは、 次の場合、編集可能なテキストフィールドに関する状態情報が失われます。 アプリはフォアグラウンドに戻りました。 これは、たとえば次のように見られます。 にテキストを入力すると、TextFieldウィジェットが失われます Java コードですが、Dart コードでも記憶されています。

この変更により、 プラットフォーム側は今度はtextInputチャネル というメッセージTextInput.requestExistingState。 これにより、アプリが起動すると、Dart コードに次のことが通知されます。 テキスト入力接続を再確立する必要があります プラットフォームに最も多くのことを通知します 最近判明した編集状態。

TextInputクラスは、次を使用してクライアント ウィジェットと対話します。 のTextInputClientインターフェース。このインターフェースは以前は クライアントが現在持っている価値についての洞察は提供されませんでした。 を許可するには、TextInput適切に対応するクラスTextInput.requestExistingState、新しいゲッターが追加されましたTextInputClient呼ばれたcurrentTextEditingValue。 最後に渡された値を安全に使用することはできません。TextInputConnection.setEditingState、クライアント以来 特定の状況下でのみそのメソッドを呼び出します。 Dart コードが の値を直接変更する場合などTextEditingController直接反映しない方法で キー入力イベントに対する応答のプラットフォームのネイティブ処理。 このようにして、TextInputFormatter一般的には機能しますが、 または Dart コードが直接設定された場合に何が起こるかTextEditingController.value

移行ガイド

以前に実装または拡張したことがある場合TextEditingClient、 ここで、適切なオーバーライドを追加する必要があります。currentTextEditingValue

この値は null の場合があります。

移行したい場合この変化が到来し、 自分のクラスにクラスを追加できます 次のようなものです。

abstract class _TemporaryTextEditingClient {
  TextEditingValue get currentTextEditingValue;
}

これにより、新しいメンバーを追加できるようになります。@override変更が着地する前の注釈 枠組みの中で。後で、 一時的なインターフェイス定義。

移行前のコード:

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

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

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

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

移行後のコード:

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 ドキュメント:

  • TextInput
  • TextInputClient
  • EditableText
  • SystemChannels.textInput

関連する問題:

  • 問題 47137

関連する PR:

  • requestExistingInputState 応答を修正