【问题标题】:building a wrapper widget for a formfield and controller in flutter在颤振中为表单域和控制器构建一个包装器小部件
【发布时间】:2019-10-17 12:51:08
【问题描述】:

我喜欢为包含控制器的 TextFormField 创建一个包装小部件,因为我必须在验证函数中访问 TextFormField 的值。使用下面粘贴的代码,每次 MyTextField 获得焦点时,都会再次调用 contructorbuild 方法。这会导致myInputController 的重新生成,这会导致每次我点击它时文本字段都是空的。

class MyTextField extends StatelessWidget {

  TextEditingController myInputController;

  MyTextField() {
       myInputController = TextEditingController();
  } 

  @override
  Widget build(BuildContext context) {
    print("build called");
    return TextFormField(
      controller: myInputController,
    );
  }
}

在应用程序中,我插入了这样的小部件:

 ...
 child: SingleChildScrollView(
   child: Form(
     key: _formKey,
     child: Column(
       children: <Widget>[
       MyTextField(),
       TextFormField(
              ),
       ...

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    如果您需要使用Form()widget,那么您应该使用StatefulWidget 而不是StatelessWidget

    所以,你只想在你的代码中使用StatefulWidget

    【讨论】:

      【解决方案2】:

      从 build 方法返回 null。

      然后放这个,

      TextEditingController myInputController = new TextEditingController();
      

      取而代之的是,

      TextEditingController myInputController;
      
      MyTextField(){
          myInputController = TextEditingController();
      }
      

      【讨论】:

      • 谢谢。我试过但不幸的是它没有解决问题:从构建函数返回 null 会引发此异常:“构建函数返回 null。”。我还更改了myInputController 的初始化,但我认为这没有什么不同。
      • @MarcS82 嘿,无需为控制器创建无状态小部件。把它放在包含 textFormField 的类上
      猜你喜欢
      • 1970-01-01
      • 2021-09-14
      • 2019-01-13
      • 2019-12-27
      • 2020-03-03
      • 2023-03-07
      • 2020-05-30
      • 1970-01-01
      • 2021-08-20
      相关资源
      最近更新 更多