无状态小部件会自行处置吗?

时间:2019-04-06 13:44:31

标签: dart flutter statelesswidget

我创建了一个PostUpdaterWidget扩展StatelessWidget,它利用TextEditingControllers来测试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中没有dispose StatelessWidget函数的方法。

我已经考虑过创建自己的dispose函数来处理所使用的控制器,并且只为将要使用此控件的控件创建此控件的变量,以便我可以调用dispose函数。

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

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

1 个答案:

答案 0 :(得分:5)

This question似乎表明--volume-from被销毁时对象没有被处置,至少不是立即被销毁。无论如何,当您使用StatelessWidget(或保持任何可变状态)时,都应使用TextEditingController并将状态保留在StatefulWidget类中。 State类具有一个State方法,您可以使用(如您在问题中所提到的)。

否则,如果使用dispose(),则每次重建UI时都会丢失状态。 StatelessWidget在整个重建过程中保持其状态,因为状态在StatefulWidgets类中,而不在小部件中。另请参见this answer