Flutter TextEditingController值在小部件构建时重置

wb1gzix0  于 2023-06-30  发布在  Flutter
关注(0)|答案(2)|浏览(147)

我需要在小部件构建方法期间设置TextEditingController的值。
问题是,每次小部件重建时,_controller值都会重置为原始状态,新值会消失:
final TextEditingController _controller = new TextEditingController();

Widget _build(BuildContext context) {
   
   myString = "Value only available in widget build";

   new TextField(
      keyboardType: TextInputType.number,
      inputFormatters: [FilteringTextInputFormatter.digitsOnly],
      controller: _controller..text = myString,
   ),

}
在上面的示例中,myString是在小部件构建期间声明的。不幸的是,它不能在initState期间声明,因此我的问题。
我怎样才能只在第一次构建时设置_controller的值,并防止它在小部件重新构建后重置为原始值?
有什么建议吗?

nxagd54h

nxagd54h1#

从你所说的,你不需要使用StoreConnector的小部件,你不想更新时,更新您的商店。你完全可以这样做:

String? myString;

Widget build(BuildContext context) {
   if (myString == null) {
     //Once myString is assigned it will not update.
     myString = StoreProvider.of<YourClass>(context).state.myString;
     _controller.text = myString;
   }
   return TextField(
      keyboardType: TextInputType.number,
      inputFormatters: [FilteringTextInputFormatter.digitsOnly],
      controller: _controller,
   );
}

另外,如果你想用StoreConnector<>来做,你可以这样做:

return StoreConnector(
   builder: (context, value) {
     return TextField(
      keyboardType: TextInputType.number,
      inputFormatters: [FilteringTextInputFormatter.digitsOnly],
      controller: _controller,
     );
   }, 
   rebuildOnChange: false, //Add this line to stop rebuilding when store changes.
 );
6qfn3psc

6qfn3psc2#

您可以将文本控制器的值设置到页面的initState()中,这样它就可以在重建后防止重置

相关问题