TextField值未在Flutter中更新

wkyowqbh  于 2022-11-25  发布在  Flutter
关注(0)|答案(2)|浏览(185)
class UserInputArea extends StatefulWidget {
  @override
  State<UserInputArea> createState() => _UserInputAreaState();
}

class _UserInputAreaState extends State<UserInputArea> {
  @override
  Widget build(BuildContext context) {
    String convertedText='';
    setState(() {
       convertedText = Provider.of<UserText>(context, listen: true).convertedText;
       print('convertedText :: $convertedText');
    });
    return Card(
      elevation: 10,
        child: Container(
          padding: EdgeInsets.all(10),
          child: TextField(
              decoration: InputDecoration(hintText: convertedText.isNotEmpty ? convertedText : 'Enter text'),
              keyboardType: TextInputType.multiline,
              maxLines: 5,
              onChanged: (value){
                Provider.of<UserText>(context, listen: false).updateText(value);
              },
            ),
        ),
    );
  }
}

每当convertedText更新时,需要更新hintText字段。仅当屏幕以某种方式刷新时,才会发生此更新(在应用程序栏中,如果点击主页按钮图标,则TextField中的数据将更新),使用应侦听更改并更新所需字段的提供程序包,不起作用。因此将页面转换为有状态小部件并添加了setState()&在里面移动了convertedText变量。但是它仍然不工作,并且不能弄清楚,这里到底缺少什么?任何帮助都表示感谢。提前感谢

sg24os4d

sg24os4d1#

请使用TextEditingController class
您的代码将如下所示

class UserInputArea extends StatefulWidget {
      @override
      State<UserInputArea> createState() => _UserInputAreaState();
    }
    
    class _UserInputAreaState extends State<UserInputArea> {
      final TextEditingController nameController = TextEditingController();
      @override
      void initState() {
       nameController.text = "test";
       super.initState();
       //Here you should write your func to change the controller value  
       Future.delayed(const Duration(seconds: 2), () {
       nameController.text = 'test after chabging';
       });
      } 
      @override
      Widget build(BuildContext context) {
       
        return Card(
          elevation: 10,
            child: Container(
              padding: EdgeInsets.all(10),
              child: TextField(
               controller: nameController,
                  decoration: InputDecoration(hintText: convertedText.isNotEmpty ? convertedText : 'Enter text'),
                  keyboardType: TextInputType.multiline,
                  maxLines: 5,

                ),
            ),
        );
      }
    }

在上面的代码中,当你进入页面时,提示文本将在2秒后测试,值将是“chabging后测试”,没有任何问题,你不需要setState((){})我累了,它工作

xjreopfe

xjreopfe2#

我认为将SetState()放入方法中并从onChanged调用方法可以解决这个问题。然后将它从Widget build中移走。类似于:

class UserInputArea extends StatefulWidget {
          @override
          State<UserInputArea> createState() => _UserInputAreaState();
        }
        
        class _UserInputAreaState extends State<UserInputArea> {
          String convertedText='';
          void _updateField() {
             setState(() {
             convertedText = Provider.of<UserText>(context, listen: true).convertedText;
             print('convertedText :: $convertedText');
          });

          @override
          Widget build(BuildContext context) {
            return Card(
              elevation: 10,
                child: Container(
                  padding: EdgeInsets.all(10),
                  child: TextField(
                      decoration: InputDecoration(hintText: convertedText.isNotEmpty ? convertedText : 'Enter text'),
                      keyboardType: TextInputType.multiline,
                      maxLines: 5,
                      onChanged: (value){
                        Provider.of<UserText>(context, listen: false).updateText(value);
                        _updateField();
                      },
                    ),
                ),
            );
          }
        }

相关问题