アプリの上部にある継承されたウィジェットを使用して、新しい場所が設定されるたびにアプリケーションを更新します。これにより、アプリ内のすべての可能な場所で位置座標が更新されます。
ただし、テキストフィールドもあります。数秒後にテキストフィールドをタップすると、継承されたウィジェットの更新によってキーボードが非表示になります。フラッターがキーボードを非表示にしたり、状態を再初期化して、継承されたウィジェットの更新が検索フィールドと連携して機能するようにする方法はありますか?また、テキストを入力すると、継承されたウィジェットがトリガーされて新しい更新が行われるが、検索バーとキーボードは開いたままになる可能性もあります。
new TextField(
controller: _controller,
autocorrect: false,
autofocus: true
...
)
すべてのコードを見ないと、何が起こっているのかを知るのは少し難しいです。
私の推測では、継承されたウィジェットからの更新を登録するために、TextFieldの上のどこかにコンテキストを使用していると思います。
ただし、TextFieldからウィジェットツリーを上に移動し、その上のコンテキストで継承されたウィジェットを使用していないことを確認することをお勧めします。ビルドメソッドの先頭にいくつかのデバッグステートメントを配置して、ビルドがどこからトリガーされているかを正確に判断することをお勧めします(継承されたウィジェットは、正しく使用している場合、そのすぐ下で再構築をトリガーするべきではありませんが、奇妙なことがあります起こりました)。
これには、次のようなものがある場合が含まれます。
MyWidget extends StatelessWidget {
Widget build(BuildContext context) {
Location location = MyInheritedWidget.of(context).location;
return new Row(
children: [
new LocationDisplayer(location),
new TextField( ..... ),
],
);
}
}
私がこれを言う理由は、継承されたウィジェットがどのように機能するかについての私の理解からです。変更されると、継承されたウィジェットを取得するためにコンテキストが使用されたウィジェットが再構築されます。
つまり、テキストフィールドは技術的にプロパティを変更していませんが、ビルドの進行状況によっては実際には新しいテキストフィールドになる可能性があります(新しいvsを作成するタイミングを決定する方法については、少しフラッターマジックがあります。再構築)、したがって、フォーカスを要求していません。
MyAliExpressWidgetを使用しているものをすべて囲むために新しいウィジェットをたくさん作成する必要はなく、次のようなものを使用できると思います。
MyWidget extends StatelessWidget {
Widget build(BuildContext context) {
return new Row(
children: [
new Builder(
builder: (context) {
Location location = MyInheritedWidget.of(context).location;
return new LocationDisplayer(location);
},
),
new TextField( ..... ),
],
);
}
}
これをどこでも行っていないことを100%確信している場合は、フラッターではない方法で物事を行うことができます...ロケーションクラスは、サブスクライブおよびサブスクライブ解除メソッドを公開する可能性があります。実際にロケーションを使用しているすべてのウィジェットは、サブスクライブ(ステートフルウィジェットでもある必要があります)を呼び出し、コールバックを使用してサブスクライブinitState()
を解除しますdispose()
。ロケーションクラスは、現在行っているように状態を変更するのではなく、単に各コールバックを呼び出すだけです。各コールバック内で、setState
実際にロケーションを表示するウィジェットを呼び出す必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加