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 応答を修正