Flutter TextField 在焦点改变时丢失数据
Flutter TextField is losing data when focus changes
我有这样的文本表单域:如果我没有为第二个文本表单域定义键盘类型,那么当我从第一个字段到第二个字段时没有问题,我不会丢失第一个字段的输入。但是如果我在我的代码中定义键盘类型,当我点击第二个字段时它会丢失第一个字段的数据。
注意:我使用 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 运行良好。(有状态小部件之外的另一种解决方案。)
final TextEditingController titleController = TextEditingController(text:'');
final TextEditingController priceController = TextEditingController(text: '');
你能这样试试吗?
final TextEditingController titleController = TextEditingController();
final TextEditingController priceController = TextEditingController();
我认为问题不在于失去焦点,而在于小部件被重建,class 被重新创建,因此 - 控制器保持文本被重新创建。
我建议将 NewTx 更改为有状态小部件并将控制器移动到它的状态。
我有这样的文本表单域:如果我没有为第二个文本表单域定义键盘类型,那么当我从第一个字段到第二个字段时没有问题,我不会丢失第一个字段的输入。但是如果我在我的代码中定义键盘类型,当我点击第二个字段时它会丢失第一个字段的数据。
注意:我使用 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 运行良好。(有状态小部件之外的另一种解决方案。)
final TextEditingController titleController = TextEditingController(text:'');
final TextEditingController priceController = TextEditingController(text: '');
你能这样试试吗?
final TextEditingController titleController = TextEditingController();
final TextEditingController priceController = TextEditingController();
我认为问题不在于失去焦点,而在于小部件被重建,class 被重新创建,因此 - 控制器保持文本被重新创建。
我建议将 NewTx 更改为有状态小部件并将控制器移动到它的状态。