我试图在无状态小部件中使用TextFormField以及ScopedModel来处理其中的文本并面临如下的各种问题.
>我尝试使用控制器进行字段,但每次我输入一些文本并按键盘完成后,文本就会被清除.不知道为什么.
>如果我删除控制器,文本将保留在字段中,但会创建有关如何从字段获取文本的新问题.我通过使用回调onFieldSubmitted来解决它.
>但事实证明,当我们点击键盘上的完成按钮时,onFieldSubmitted才会被调用.如果我在字段中输入文本而不是单击确定,单击另一个字段,将不会调用回调,我将无法跟踪用户在字段中输入的内容.
对此有何解决方案?
附加问题的示例代码.
class LoginPageStateless extends StatelessWidget {
final loginUsernameController = TextEditingController();
@override
Widget build(BuildContext context) {
return Scaffold(
resizetoAvoidBottomPadding: true,
body: ScopedModelDescendant<AccountModel>(
builder: (context, child, model) {
return Form(
//key: _formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
TextFormField(
style: TextStyle(fontSize: 15.0),
decoration: Inputdecoration(
labelText: 'Email id',
hintText: '[email protected]',
),
controller: loginUsernameController,
onFieldSubmitted: model.updateLoginUsernameText,
),
TextFormField(
style: TextStyle(fontSize: 15.0),
decoration: Inputdecoration(
labelText: 'Password',
),
controller: loginUsernameController,
onFieldSubmitted: model.updateLoginUsernameText,
obscureText: true,
),
],
),
);
},
),
);
}
}
解决方法:
您不能也不应该使用Stateless小部件来存储长期变量.
问题是,这正是你想要的. TextEditingController是一个应该保留在渲染之间的类实例.但是通过将其存储到StatelessWidget中,您基本上可以在每次更新后重新创建它.
您应该将窗口小部件转换为有状态.并将该控制器移动到State部分
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。