如何在 Flutter 中使用带有 Provider 的 textEditiing 控制器

How to use textEditiing controller with Provider in Flutter

我正在使用提供程序进行状态管理。我的情况是我的表单中有多种类型的字段。问题在于文本字段 每当我更改文本时,它都会表现得很奇怪,就像输入的文本以相反的顺序显示一样。

class MyProvider with ChangeNotifier{
  String _name;
  String get name => _name;
  setname(String name) {
    _name = name;
    notifyListeners();
  }
}

class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final MyProvider myProvider = Provider.of<MyProvider>(context);

    final TextEditingController _nameController = TextEditingController(
        text: myProvider.name,
    );

    return TextField(
        controller: _nameController,
        onChanged: myProvider.setname,
    );

}

要将 TextField 中的文本存储到提供程序中,您需要将文本 属性 从控制器发送到提供程序:

_nameController.addListener(() {
    myProvider.setName(_nameController.text);
});

这也将解决您在文本字段中获取反向文本的问题

这是因为 TextEditingController 的新实例在每个小部件构建时都会创建,并且有关当前光标位置 (TextEditingValue) 的信息正在丢失。

initState 方法中创建一个控制器并在 dispose 方法中处理它。


class MyWidget extends StatefulWidget {
  @override
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  TextEditingController _nameController;

  @override
  void initState() {
    final MyProvider myProvider = Provider.of<MyProvider>(context, listen: false);

    super.initState();
    _nameController = TextEditingController(text: myProvider.name);
  }

  @override
  void dispose() {
    _nameController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    final MyProvider myProvider = Provider.of<MyProvider>(context);

    return TextField(
        controller: _nameController,
        onChanged: myProvider.setname,
    );
  }
}