dart - 在 Flutter 中 TextField 的 onChanged 回调中设置后字符串被重置
问题描述
String 变量的值在由 TextField onChanged 回调设置后被重置。在 Button onPressed 回调中检查时。但其他数据类型似乎没问题。
总的来说,我是 Flutter 和 Dart 的新手,所以我刚刚尝试了所有想到的荒谬解决方案,比如使用 setState(),创建单独的函数来处理它,从上下文中剥离其他所有内容,但似乎都没有工作。
String itemName;
String testVal;
int quantity;
int price;
return Scaffold(
appBar: AppBar(title: Text("New Item")),
body: Column(
children: <Widget>[
Text("Name"),
TextField(onChanged: (val) => itemName = val),
Text("Test"),
TextField(keyboardType: TextInputType.text, onChanged: (val) => testVal = val),
Text("Quantity"),
TextField(keyboardType: TextInputType.number, onChanged: (String val) => quantity = num.tryParse(val)),
Row(children: <Widget>[Text("Price"), Flexible(child: TextField(maxLines: 1,keyboardType: TextInputType.number, onChanged: (String val) => price = num.tryParse(val)))]),
Center(child: RaisedButton(child: Text("Submit"), onPressed: () { print("This is NOT working? $itemName"); }))
],
),
);
onPressed(printing itemName) 中的 print 语句也应该打印 textField 更改的任何值,但它总是打印 null。尽管 textField 的值正在更改(检查是否使用打印语句调试对于回调来说是徒劳的,如果有一种调试方法也会有所帮助)。
testVal 的问题是一样的,但是数量和价格都很好,因为它们是整数。
我也用 DateTime 进行了同样的测试,它也工作得很好。
解决方案
问题是因为当键盘显示或关闭build
你的小部件的颤振框架调用方法并且你的局部变量都重新启动时。
解决此问题的一种简单方法是使用StatefullWidget
变量并将其定义为小部件状态。
class YourWidget extend StatefullWidget {
_YourWidgetState createState() => _YourWidgetState();
}
class _YourWidgetState extends State<YourWidget> {
String itemName;
String testVal;
int quantity;
int price;
Widget build(BuildContext context) {
return ... // return your layout.
}
}
推荐阅读
- html - 如何在浏览器上禁用自动保存密码
- apache - htaccess 使用 301 重定向 php url
- flutter - 如何获取用户的 Facebook 用户名或 ID?
- c# - 我该怎么做这个项目
- visual-studio-code - VsCode 中的自定义 Emmet 片段不起作用
- python - 我在 python 中创建了一个单元测试项目并得到了一些如下所示的错误
- python - 如何使我在 PCF 中托管的 python 代码从网络共享驱动器中读取 excel 文件
- firebase - 关于使用 for 循环读取 firestore 文件
- flutter - 如何将省略号添加到行小部件中两个文本小部件之间的文本小部件
- video-streaming - 无法使用 RTSP API (janus) 创建永久流挂载点