我正在使用Provider进行状态管理.我所处的情况是,我的表单中有多种类型的字段.问题出在文本字段上 每当我更改文本时,它的行为都很奇怪,就像输入的文本以相反的顺序显示一样.

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,
    );

}

推荐答案

之所以会发生这种情况,是因 for each 小部件构建都会创建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,
    );
  }
}

Dart相关问答推荐

Dartpad使用基本身份验证发出请求

空值判断运算符 - Flutter

在Flutter中在 initstate() 之前调用了dependOnInheritedElement()

使用 2 个类型参数声明类型StateNotifierProvider,但给出了 1 个类型参数

如何在 Dart 中将代码迁移到 null 安全

如何在 dart 中获取当前和调用函数的名称?

如何在Flatter中将图表线 colored颜色 更改为自定义 colored颜色 代码值

如何在 Dart 中获取数字的长度?

Expansion Panel底部溢出

Dart-对base64字符串进行编码和解码

Flutter 如何使用 ListTile 三行

使用 dart 下载文件

带有 Dart 的 CORS,我如何让它工作?

在 Dart 中编写单元测试的最佳方式是什么?

Dart:将十进制转换为十六进制

dart 中隐式转换运算符的语法是什么?

安装 dart-sdk 后找不到 pub 命令

dart中的max/mi int/double 值是否有常数?

在 Dart 中,List.from 和 .of 以及 Map.from 和 .of 有什么区别?

如何使用 Dart 构建枚举?