首页 > 解决方案 > 在 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 进行了同样的测试,它也工作得很好。

标签: dartflutter

解决方案


问题是因为当键盘显示或关闭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.
     }
 }

推荐阅读