Dart 单击TextField小部件时颤振小部件重建
我确信这是一个新手的错误,但我似乎无法理解这一点。 在下面的应用程序中,当单击第二条路径中的文本字段时,键盘将打开并立即关闭。经过更仔细的调查,小部件似乎在获得焦点时被重建,导致路由重置,用户无法输入文本 当我从表单中删除“键”时,问题不会发生。这不是一个长期的解决方案,因为我需要“密钥”,以便验证表单 有什么想法吗Dart 单击TextField小部件时颤振小部件重建,dart,flutter,Dart,Flutter,我确信这是一个新手的错误,但我似乎无法理解这一点。 在下面的应用程序中,当单击第二条路径中的文本字段时,键盘将打开并立即关闭。经过更仔细的调查,小部件似乎在获得焦点时被重建,导致路由重置,用户无法输入文本 当我从表单中删除“键”时,问题不会发生。这不是一个长期的解决方案,因为我需要“密钥”,以便验证表单 有什么想法吗 import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp
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,
),
),
);
}
}
导入“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“我的应用程序”,
debugShowCheckedModeBanner:false,
主题:主题数据(
主样本:颜色。浅蓝色,
fontFamily:“努尼托”,
),
主页:登录页面(),
);
}
}
类LoginPage扩展StatefulWidget{
@凌驾
LoginPagentate createState(){
返回新的loginPagentate();
}
}
类LoginPagentate扩展了状态{
小部件构建(构建上下文){
最终GlobalKey _scaffoldKey=新的GlobalKey();
最终寄存器按钮=填充(
填充:边缘组。对称(垂直:16.0),
孩子:升起按钮(
形状:圆形矩形边框(
边界半径:边界半径。圆形(24),
),
已按下:(){
导航器。推(
上下文
MaterialPage路由(生成器:(上下文)=>SecondPage()),
);
},
子项:Text('Register Now',style:TextStyle(颜色:Colors.white)),
),
);
//现在加载主登录页面
返回脚手架(
背景颜色:Colors.white,
钥匙:_scaffoldKey,
正文:中(
子:ListView(
收缩膜:对,
儿童:[
注册表按钮,
],
),
),
);
}
}
类SecondPage扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
最终emailController=TextEditingController();
final _formKey=GlobalKey();
最终电子邮件=TextFormField(
键盘类型:TextInputType.emailAddress,
控制器:emailController,
自动对焦:错误,
装饰:输入装饰(
hintText:“电子邮件”,
内容填充:来自LTRB(20.0,10.0,20.0,10.0)的EdgeInsets,
边框:大纲输入边框(边框半径:borderRadius.circular(32.0)),
),
);
返回脚手架(
appBar:appBar(
标题:文本(“第二页”),
),
正文:中(
孩子:表格(
键:_formKey,
孩子:电子邮件,
),
),
);
}
}
您必须将\u formKey声明为构建方法之外的静态 当您单击文本字段
时,颤振重新声明您的\u formKey
。因此,需要重新构建您的小部件。您需要在build
方法之外声明\u formKey
,这样flatter就不会重新声明您的变量。当我们单击TextField
时,flatter会自动调用build()
方法,这样您的所有对象都将被重新创建,并在build()
方法中进行初始化
这就是为什么总是创建在Form()
中使用的全局变量,如:
final emailController = TextEditingController();
final _formKey = GlobalKey<FormState>();
final-emailController=TextEditingController();
final _formKey=GlobalKey();
感谢您的回复,在生成方法之外声明_formkey时也会发生相同的行为。请将其设置为静态。谢谢您的帮助!你能解释为什么声明为static会有不同吗?我不知道更多。几天前我遇到了同样的问题,当时我在github上找到了解决方案。我认为Flatter试图重新声明formkey,这可能会造成混乱,这就是原因。我有类似的问题,当我调试程序时,在我的情况下,页面小部件由Navigator.push触发,每次点击文本字段时,Navigator.push似乎会在页面小部件创建时再次执行。您是否尝试在Navigator.push上设置断点?能否提供有关如何为TextField使用全局变量\u formKey
的示例