Виджеты без состояния располагают самостоятельно?

Я создал 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класс, а не в виджете. См. Также этот ответ.

Другие вопросы по тегам