Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 单击TextField小部件时颤振小部件重建_Dart_Flutter - Fatal编程技术网

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
的示例