Виджеты без состояния располагают самостоятельно?
Я создал PostUpdaterWidget
простирающийся StatelessWidget
который использует TextEditingControllers
для тестирования реализации Bloc Pattern.
final _usernameController = TextEditingController();
final _contentController = TextEditingController();
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
TextField(
controller: _usernameController,
decoration: InputDecoration(hintText: "Post Username"),
),
TextField(
controller: _contentController,
decoration: InputDecoration(hintText: "Post Content"),
),
Container(
height: 16,
),
RaisedButton(
child: Text("Update Post"),
onPressed: () => _updatePost(context),
)
],
);
}
_updatePost(BuildContext context) {
print("Processing Post Update");
String username = _usernameController.text.trim();
String content = _contentController.text.trim();
Post post = new Post();
post.id = id;
post.username = username;
post.content = content;
id += 1;
print("Dispatching Post Update");
BlocProvider.of<PostBloc>(context).updatePost(post);
}
Я видел во многих примерах, что контроллеры должны быть расположены. Однако нет способа override
dispose
функция в StatelessWidget
,
Я думал о создании своей собственной функции dispose для удаления используемых контроллеров, и просто создал переменную этого виджета для тех, кто будет использовать этот виджет, чтобы я мог вызвать функцию dispose.
Но сначала я хочу узнать, действительно ли мне нужно это делать, или этот StatelessWidget фактически удаляется сам по себе.
Должен ли я продолжить свою идею? Или просто оставьте это, поскольку он может самостоятельно утилизировать эти контроллеры, чтобы меня не беспокоили утечки памяти.
0 ответов
Этот вопрос, кажется, указывает на то, что объекты не удаляются, когдаStatelessWidget
уничтожается, по крайней мере, не сразу. В любом случае, когда вы используетеTextEditingController
(или поддерживая любое изменяемое состояние), тогда вы должны использовать StatefulWidget
и держать состояние в State
учебный класс. ВState
класс имеет dispose()
метод, который вы можете использовать (как вы упомянули в своем вопросе).
В противном случае, если вы используете StatelessWidget
, вы теряете свое состояние каждый раз, когда пользовательский интерфейс перестраивается. StatefulWidgets
сохраняют свое состояние при перестроениях, потому что состояние находится в State
класс, а не в виджете. См. Также этот ответ.