我正在尝试获取用户输入并将其存储在数据结构中。我有一个带状态的窗口小部件,该窗口小部件具有文本控制器,可让我抓取值。然后,将这些值传递到无状态按钮并提交。但是,问题是当我再次访问屏幕时,文本控制器会记住其先前的值,并且弄乱了如何将数据输入到数据结构中。我读到我需要在文本控制器上调用.dispose。解决这个问题。这将去哪里?
JournalView状态状态小部件
class JournalEntryView extends StatefulWidget {
@override
_MyCustomFormState createState() => _MyCustomFormState();
}
// Define a corresponding State class.
// This class holds the data related to the Form.
class _MyCustomFormState extends State<JournalEntryView> {
// Create a text controller and use it to retrieve the current value
// of the TextField.
final titleController = TextEditingController();
final journalController = TextEditingController();
@override
void dispose() {
// Clean up the controller when the widget is disposed.
titleController.dispose();
journalController.dispose();
super.dispose();
}
void check()
{
if(titleController != null);
dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.lightGreen,
body: Stack(alignment: Alignment.center, children: <Widget>[
Align(
alignment: Alignment(-.9, -.85),
child: Text("Journal Entry",
style: TextStyle(
fontFamily: "Gotham-Light",
color: Colors.white,
fontSize: 20.0))),
Align(alignment: Alignment(-.9,-.65),
child: Text("Title",style: TextStyle(
fontFamily: "Gotham-Light",
color: Colors.white,))
),
Align(alignment: Alignment(0,-.5),
child: TextField(
controller: titleController,
decoration: InputDecoration(border: OutlineInputBorder()),
)),
Align(alignment: Alignment(-.9,-.15),
child: Text("Entry",style: TextStyle(
fontFamily: "Gotham-Light",
color: Colors.white,))),
Align(
alignment: Alignment(0, .15),
child: TextField(
controller: journalController,
minLines: 2,
maxLines: 10,
decoration: InputDecoration(border: OutlineInputBorder()))),
Align(
alignment: Alignment(.4, .7),
child: JournalButton(
journalTitle: titleController,
journalBody: journalController,
buttonLabel: "Continue",
screen: Helm(),
))
]));
}
}
日记按钮无状态
class JournalButton extends StatelessWidget {
Widget screen;
String buttonLabel;
TextEditingController journalTitle;
TextEditingController journalBody;
String journalEntry;
Journal journal = Journal();
JournalButton(
{this.screen, this.buttonLabel, this.journalBody, this.journalTitle});
@override
Widget build(BuildContext context) {
// Helm looks up all the other views
Helm helm = new Helm();
// TODO: implement build
return SizedBox(
width: 200,
height: 60,
child: RaisedButton(
child: Text(buttonLabel,
textAlign: TextAlign.center,
style: TextStyle(color: Colors.white, fontSize: 20)),
color: Colors.orange,
onPressed: () {
print(journalTitle.text);
print(journalBody.text);
journal.addEntry( // Data submitted to data structure here
Entry(
body: journalBody.text,
title: journalTitle.text,
dateTime: DateTime.now(),
),
);
Navigator.push(
context,
MaterialPageRoute(builder: (context) => screen),
);
// journalTitle.dispose();
// journalBody.dispose();
}),
);
}
}
这是一个随机错误消息,通过进行抖动清理和重建来解决。注意自我总是飘动干净。