在 Flutter 中导航后无法关注新页面中的 TextField
Cannot focus on TextField in new page after navigating in Flutter
出于某种原因,我无法在导航后的下一页上关注 TextField。选择 TextField 时,键盘会自动关闭。如果我在 TextField 上设置 autofocus: true
,那么键盘将无限弹出并立即一次又一次地消失。
当我的应用程序大小合适时我遇到了这个问题,但我能够在一个最小的示例应用程序中重新创建它。
我正在使用 Dart 2.0.0-dev.55.0 和 Flutter beta v0.3.2。
主页代码:
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,我可以很好地关注它,但不能放在“设置”页面中的那个上。我认为这与键盘没有优先于弹出页面有关?或者发生了什么事?我如何才能让应用程序只关注导航页面上的输入字段?
所以问题出在我正在向脚手架提供 GlobalKey。删除密钥可以解决问题。不确定原因,但这个问题主要在 Github issue 中解释。
我在验证输入时显示错误消息时使用快捷键弹出快餐栏,但现在我选择只在文本小部件中显示错误消息。
全局密钥也有类似的问题。正在查看 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...',
)
)
不确定您的问题是什么,因为我无法再重现它。我刚刚在 Flutter Channel beta 1.18.0-11 中尝试了您的代码。1.pre 一切正常,无需修改您的原始代码。
看起来更像是Flutter的bug
只需将 autofocus
添加为 true
,这将在导航到新屏幕时打开键盘
TextField(
autofocus: true,
),
在我的例子中,autofocus:true 不仅仅适用于 iOS 模拟器,但它适用于 Android 和 iOS[=10] 的真实设备=]
出于某种原因,我无法在导航后的下一页上关注 TextField。选择 TextField 时,键盘会自动关闭。如果我在 TextField 上设置 autofocus: true
,那么键盘将无限弹出并立即一次又一次地消失。
当我的应用程序大小合适时我遇到了这个问题,但我能够在一个最小的示例应用程序中重新创建它。
我正在使用 Dart 2.0.0-dev.55.0 和 Flutter beta v0.3.2。
主页代码:
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,我可以很好地关注它,但不能放在“设置”页面中的那个上。我认为这与键盘没有优先于弹出页面有关?或者发生了什么事?我如何才能让应用程序只关注导航页面上的输入字段?
所以问题出在我正在向脚手架提供 GlobalKey。删除密钥可以解决问题。不确定原因,但这个问题主要在 Github issue 中解释。
我在验证输入时显示错误消息时使用快捷键弹出快餐栏,但现在我选择只在文本小部件中显示错误消息。
全局密钥也有类似的问题。正在查看 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...',
)
)
不确定您的问题是什么,因为我无法再重现它。我刚刚在 Flutter Channel beta 1.18.0-11 中尝试了您的代码。1.pre 一切正常,无需修改您的原始代码。
看起来更像是Flutter的bug
只需将 autofocus
添加为 true
,这将在导航到新屏幕时打开键盘
TextField(
autofocus: true,
),
在我的例子中,autofocus:true 不仅仅适用于 iOS 模拟器,但它适用于 Android 和 iOS[=10] 的真实设备=]