Я пытаюсь получить пользовательский ввод и сохранить его в структуре данных. У меня есть виджет с сохранением состояния, который имеет текстовые контроллеры, которые позволяют мне захватывать значения. Затем эти значения передаются кнопке без сохранения состояния и отправляются. Однако проблема в том, что когда я снова получаю доступ к экрану, текстовый контроллер запоминает свое предыдущее значение и портит способ ввода данных в структуру данных. Я прочитал, что мне нужно вызвать .dispose на контроллерах текста. чтобы исправить это. Где бы это go?
Журнал Просмотр состояния с отслеживанием состояния
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();
}),
);
}
}