我创建了一个容器输入的表单。
我循环遍历输入列表来创建表单。
我的变量是:
List fields = [
{
'label': Strings.firstName,
'controller': _fnameController,
'validator': (val) => Validation.mustFilled(val),
},
{
'label': Strings.lastName,
'controller': _lnameController,
'validator': (val) => Validation.mustFilled(val),
},
{
'label': Strings.phoneNumber,
'controller': _mobileController,
'validator': (val) => Validation.mobile(val),
},
];
和我的 TextEditingController 定义:
static TextEditingController _fnameController = TextEditingController();
static TextEditingController _lnameController = TextEditingController();
static TextEditingController _mobileController = TextEditingController();
我从上一个屏幕获取输入值并在 initState 中设置输入:
@override
void initState() {
super.initState();
_fnameController.text = widget.userProfile.firstName;
_lnameController.text = widget.userProfile.lastName;
_mobileController.text = widget.userProfile.phoneNumber;
}
for (var item in fields)
Container(
margin: EdgeInsets.symmetric(vertical: 10.0),
child: Input(
controller: item['controller'],
label: item['label'],
validator: item['validator'],
),
),
和我的输入小部件:
class Input extends StatelessWidget {
final String label;
final VoidFunc validator;
final TextEditingController controller;
Input({this.label, this.validator, this.controller});
@override
Widget build(BuildContext context) {
return TextFormField(
autovalidate: true,
controller: controller,
textAlignVertical: TextAlignVertical.center,
cursorColor: ColorPalette.secondary_3_5,
decoration: InputDecoration(
filled: true,
labelText: label,
),
validator: (value) => validator(value),
);
}
}
最后处理它们:
@override
void dispose() {
_fnameController.dispose();
_lnameController.dispose();
_mobileController.dispose();
super.dispose();
}
一切正常,但是当我导航到上一个屏幕(使用后退按钮)然后再次来到此屏幕时,我收到此错误:
A TextEditingController was used after being disposed.
Once you have called dispose() on a TextEditingController, it can no longer be used.
The relevant error-causing widget was