我创建一个容器输入的表单。 我遍历输入列表以创建表单。 我的变量是:
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
答案 0 :(得分:2)
请从static
中删除TextEditingController
关键字
更改为
static TextEditingController _fnameController = TextEditingController();
static TextEditingController _lnameController = TextEditingController();
static TextEditingController _mobileController = TextEditingController();
收件人
TextEditingController _fnameController = TextEditingController();
TextEditingController _lnameController = TextEditingController();
TextEditingController _mobileController = TextEditingController();
我使用以下完整代码重现此错误。
import 'package:flutter/material.dart';
void main() {
runApp(MaterialApp(
title: 'Navigation Basics',
home: FirstRoute(),
));
}
class FirstRoute extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('First Route'),
),
body: Center(
child: RaisedButton(
child: Text('Open route'),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondRoute()),
);
},
),
),
);
}
}
class SecondRoute extends StatefulWidget {
@override
_SecondRouteState createState() => _SecondRouteState();
}
class _SecondRouteState extends State<SecondRoute> {
static TextEditingController _fnameController = TextEditingController();
@override
void dispose() {
_fnameController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Second Route"),
),
body: Center(
child: RaisedButton(
onPressed: () {
Navigator.pop(context);
},
child: Text('Go back!'),
),
),
);
}
}