30

我创建了一个PostUpdaterWidget扩展StatelessWidgetTextEditingControllers用于测试 Bloc 模式的实现。

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用于.disposeStatelessWidget

我曾想过创建自己的 dispose 函数来处理使用的控制器,并为那些将使用此小部件的人创建此小部件的变量,以便我可以调用 dispose 函数。

但我想首先知道我是否真的需要这样做,或者这个 StatelessWidget 实际上是自行处理的。

我应该继续我的想法吗?或者就这样吧,因为它可能会自行处理这些控制器,所以我不应该担心内存泄漏。

4

1 回答 1

18

这个问题似乎表明当对象StatelessWidget被销毁时不会处理对象,至少不会立即处理。无论如何,当您使用 a TextEditingController(或维护任何可变状态)时,您应该使用 aStatefulWidget并将状态保留在State类中。该类State有一个dispose()您可以使用的方法(正如您在问题中提到的那样)。

否则,如果您使用 a StatelessWidget,则每次重建 UI 时都会丢失您的状态。StatefulWidgets在重建过程中保持它们的状态,因为状态在State类中,而不是在小部件中。另请参阅此答案

于 2020-01-22T13:05:57.200 回答