我确定这是一个菜鸟错误,但是我似乎无法弄清楚。在下面的应用中,单击第二条路线中的文本框时,键盘将打开并立即关闭。经过仔细研究,似乎只要获得焦点,便会重新构建小部件,从而导致路由重置,从而使用户无法输入文本。
当我从表单中删除“密钥”时,不会发生此问题。这不是长期解决方案,因为我需要“密钥”,因此我可以验证表单。
有任何想法吗?
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'My app', debugShowCheckedModeBanner: false, theme: ThemeData( primarySwatch: Colors.lightBlue, fontFamily: 'Nunito', ), home: LoginPage(), ); } } class LoginPage extends StatefulWidget { @override LoginPageState createState() { return new LoginPageState(); } } class LoginPageState extends State<LoginPage> { Widget build(BuildContext context) { final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>(); final registerButton = Padding( padding: EdgeInsets.symmetric(vertical: 16.0), child: RaisedButton( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(24), ), onPressed: () { Navigator.push( context, MaterialPageRoute(builder: (context) => SecondPage()), ); }, child: Text('Register Now', style: TextStyle(color: Colors.white)), ), ); // Now load the main login page return Scaffold( backgroundColor: Colors.white, key: _scaffoldKey, body: Center( child: ListView( shrinkWrap: true, children: <Widget>[ registerButton, ], ), ), ); } } class SecondPage extends StatelessWidget { @override Widget build(BuildContext context) { final emailController = TextEditingController(); final _formKey = GlobalKey<FormState>(); final email = TextFormField( keyboardType: TextInputType.emailAddress, controller: emailController, autofocus: false, decoration: InputDecoration( hintText: 'Email', contentPadding: EdgeInsets.fromLTRB(20.0, 10.0, 20.0, 10.0), border: OutlineInputBorder(borderRadius: BorderRadius.circular(32.0)), ), ); return Scaffold( appBar: AppBar( title: Text('Second page'), ), body: Center( child: Form( key: _formKey, child: email, ), ), ); } }
您必须在构建方法之外将 _formKey 声明为静态。