どういうわけか、ナビゲートした後、次のページでTextFieldに焦点を合わせることができません。 TextFieldが選択されると、キーボードは自動的に閉じます。 autofocus: true
をTextFieldに入力すると、キーボードが無限にポップアップし、すぐに何度も繰り返し終了します。
アプリが適切なサイズのときにこれに遭遇しましたが、最小限のサンプルアプリでこれを再現することができました。
Flartベータv0.3.2でDart 2.0.0-dev.55.0を使用しています。
メインページのコード:
import 'package:flutter/material.Dart';
import 'settings.Dart';
void main() => runApp(new MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Flutter Demo',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: new MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => new _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Helpful text.',),
// ===== Where navigation happens =====
RaisedButton(
onPressed: () {
Navigator.Push(context, PageRouteBuilder(
pageBuilder: (_, __, ___) => SettingsPage()));
},
child: Text('Go to input page'),
),
],
),
),
);
}
}
以下は、TextFieldを含むページのコードです。
import 'package:flutter/material.Dart';
class SettingsPage extends StatefulWidget {
SettingsPage({Key key}) :
super(key: key);
@override
_SettingsPage createState() => new _SettingsPage();
}
class _SettingsPage extends State<SettingsPage> {
@override
Widget build(BuildContext context) {
final key = GlobalKey<ScaffoldState>();
return Scaffold(
key: key,
backgroundColor: Colors.white,
appBar: AppBar(
title: Text("Settings"),
),
body: ListView(
children: <Widget>[
Text("Enter something"),
// Can't focus on this widget
TextField(),
],
),
);
}
}
メインページにTextFieldを配置すると、そこにフォーカスできますが、[設定]ページのTextFieldにはフォーカスできません。ポップアップしたページよりもキーボードが優先されないことに関係があると思いますか?または何が起こっているのですか?ナビゲートされたページの入力フィールドのみにアプリを集中させるにはどうすればよいですか?
だから問題は私が足場にGlobalKeyを供給しているという事実から来ています。キーを削除すると、問題が解決します。正確な理由はわかりませんが、問題は主にこの Githubの問題 で説明されています。
入力の検証時にエラーメッセージを表示するときにキーを使用してスナックバーポップアップを表示していましたが、今はテキストウィジェットにエラーメッセージを表示することを選択しています。
グローバルキーで同様の問題が発生していました。 flutterのアーキテクチャのreduxの例で同様の例を調べていました。
修正したようなキーを使用して
static final GlobalKey<FormFieldState<String>> _orderFormKey = GlobalKey<FormFieldState<String>>();
この問題を解決するには、次のようなコードを使用します。
// Class private property
static final GlobalKey<FormFieldState<String>> _searchFormKey = GlobalKey<FormFieldState<String>>()
// Inside widget
TextFormField(
key: _searchFormKey, // Use searchFormKey here like this
decoration: InputDecoration(
border: OutlineInputBorder(),
labelText: 'Type here...',
)
)
テキストフィールドにフォーカスノードが追加されるという問題もありました。フォーカスノードを削除すると、問題が解決しました。