Flutterで、TextFieldに入力された文字で検索をかけるという機能を作成しております。
iosでは期待通りに動くのですが、Androidでは文字を入力しようとタップすると画面全体がリロードされてしまい、文字を入力することができません。
画面が表示される
→TextFieldをタップする
→キーボードが出てくるがすぐに画面がリロードされる(通信中と表示される)
→画面が表示されると初期の状態に戻っている
リロードしないようにしたいのですが、調べても解決できないため、お力をお借りできればと思います。
よろしくお願いいたします。
Flutter
// 呼び出し元 // ボタンをタップすると次の画面へ遷移するようになっています onPressed: () { Navigator.push(context, MaterialPageRoute(builder: (context) => const test(searchText: "searchText"))); }
Flutter
class test extends StatefulWidget { const GolfCourseSearch({Key? key, required this.searchText}) : super(key: key); final String searchText; @override _test createState() => _test(); } class _test extends State<test> { Future<String> getApiData() async { // APIを使用してデータを取得している } late BehaviorSubject<int> _events; @override void initState() { super.initState(); _events = BehaviorSubject<int>(); _events.add(0); } @override void dispose() { _events.close(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: header(), body: FutureBuilder( future: getApiData(), builder: (BuildContext context, AsyncSnapshot<String> snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { return Text("通信中"); } if (snapshot.hasData) { // 省略 TextField( onChanged: (String searchText) { // ここにログを置いても表示されない // リストから検索して結果部分だけ更新する }, // ↓あってもなくても変わりませんでした // controller: TextEditingController(text: widget.searchText), ) } } ) ) } }
TextFieldにカーソルが入ったときに表示されるログです。
I/AssistStructure(30223): Flattened final assist data: 456 bytes, containing 1 windows, 3 views D/InputConnectionAdaptor(30223): The input method toggled cursor monitoring on
追記1
回答をいただきましたので試してみましたがうまく動きませんでした。
コード、ログ等を追加いたしましたので、お気づきの点がございましたら引き続きよろしくお願いいたします。
追記2
以下のように変更することで画面が変わることなく入力ができるようになりました。
ただ、見た目が変わらないだけでTextFieldにカーソルが入るたびにgetApiDataは通っているようなので、最初のみgetApiDataを通るようにしたいです。
Flutter
class _test extends State<test> { // apiを通ったかどうかのフラグ bool flag = true; Future<String> getApiData() async { // APIを使用してデータを取得している } // 省略 @override Widget build(BuildContext context) { return Scaffold( appBar: header(), body: FutureBuilder( future: getApiData(), builder: (BuildContext context, AsyncSnapshot<String> snapshot) { if (flag && snapshot.connectionState == ConnectionState.waiting) { // apiを通ったらフラグを変える flag = false; return Text("通信中"); } // 省略 } ) ) } }
追記3
TextField外をタップした際にキーボードが閉じるように変更したところ、キーボードが閉じるタイミングでまたリロードが入りました。
TextFieldにカードルがあるかどうかではなく、キーボードの動作に関連しているように感じます。
また、追記2で入力がうまくできると記載しましたが、入力中は問題なくソートして表示してくれるのですが、TextField外タップでソートしていた内容が初期化されてしまったので意味はないようです。
まだ回答がついていません
会員登録して回答してみよう