【问题标题】:Flutter TextField is losing data when focus changesFlutter TextField 在焦点更改时丢失数据
【发布时间】:2021-04-03 13:56:41
【问题描述】:

我有这样的文本表单:如果我没有为第二个文本表单定义键盘类型,那么当我从第一个字段转到第二个字段时没有问题,我不会丢失第一个字段的输入。但是如果我在我的代码中定义了键盘类型,当我点击第二个字段时它会丢失第一个字段的数据。

注意:我使用 Riverpod 作为状态管理。


class NewTx extends StatelessWidget {
  final TextEditingController titleController = TextEditingController(text: '');
  final TextEditingController priceController = TextEditingController(text: '');

  @override
  Widget build(BuildContext context) {
    return Column(crossAxisAlignment: CrossAxisAlignment.stretch, children: [
      TextFormField(
          controller: titleController,
          decoration: InputDecoration(hintText: 'Title')
          ),
      TextFormField(
          keyboardType: TextInputType.number,
          controller: priceController,
          decoration: InputDecoration(hintText: 'Title')),
      Container(
          alignment: AlignmentDirectional.bottomEnd,
          child: IconButton(
              icon: Icon(Icons.add),
              onPressed: () => context.read(transactionProvider).addTx(
                  Transaction(titleController.text, priceController.text))))
    ]);
  }
}


编辑:riverpod_hooks 和 useTextEditingController 运行良好。(除了有状态小部件的另一种解决方案。)

【问题讨论】:

    标签: flutter dart mobile riverpod


    【解决方案1】:

    我认为问题不在于失去焦点,而在于重新构建小部件,重新创建类,结果是控制器保持文本重新创建。

    我建议将 NewTx 更改为有状态小部件并将控制器移至其状态。

    【讨论】:

    • 它正在工作,但我觉得如果我使用的是riverpod(这是一种专注于不变性的状态管理),我不应该使用有状态小部件,我的方法是否错误?(我是新来的颤振和河荚)
    • 问题是 TextControllers(以及其他控制器)不是响应式方法,因此您不能使用简单的状态管理来很好地处理这个问题。
    • @sweCB 在 Riverpod 中使用 Stateful 小部件并没有错。如果一个状态不需要是全球性的,就不要让它成为全球性的。
    • 将我所有的变量声明从小部件构建方法中移出,并将它们放在方法之外解决了我的问题。
    【解决方案2】:
    final TextEditingController titleController = TextEditingController(text:''); 
    final TextEditingController priceController = TextEditingController(text: '');
    

    你可以这样试试吗?

    final TextEditingController titleController = TextEditingController();
    final TextEditingController priceController = TextEditingController();
    

    【讨论】:

      猜你喜欢
      • 2014-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-29
      • 2020-05-27
      • 2019-11-07
      • 2015-02-28
      • 1970-01-01
      相关资源
      最近更新 更多