【问题标题】:Do stateless widgets dispose on their own?无状态小部件是否自行处理?
【发布时间】:2019-08-28 04:48:09
【问题描述】:

我创建了一个 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);
  }

我在很多例子中看到控制器应该被丢弃。但是,在StatelessWidget 中没有override dispose 函数的方法。

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

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

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

【问题讨论】:

  • 由于无状态小部件不包含状态,因此没有这样的方法。我认为最好将有状态的小部件与这样的控制器一起使用。您应该阅读以下内容:docs.flutter.io/flutter/widgets/StatelessWidget-class.html
  • @Blasanka 我认为它也更安全,但它是否真的必须正确处理,或者StatelessWidget 会在垃圾收集时自行处理?
  • @NicolasDion-Bouchard - 我认为这里存在循环引用的危险。当您设置 TextEditing 控制器时。它将引用其他数据对象。垃圾收集不会发生在这些对象上,因为它们仍然持有对其他东西的引用。这可能会导致内存泄漏。我只想转换为有状态的小部件并明确处理所有内容。 AAMOF,我只是在自己的项目中这样做了。

标签: dart flutter statelesswidget


【解决方案1】:

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

否则,如果您使用 StatelessWidget,则每次重建 UI 时都会丢失您的状态。 StatefulWidgets 在重建过程中保持其状态,因为状态在 State 类中,而不是在小部件中。另见this answer

【讨论】:

  • 假设你订阅了一个无状态小部件中的监听器,每次重建 UI 时是否都会订阅一个新的监听器?
  • @BrandonPillay,我不太确定。听起来是个有趣的问题。如果您通过代码示例将其作为一个新的 SO 问题提出,您可以在此处放置指向它的链接吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-10
  • 2021-07-29
  • 2022-11-18
  • 2021-12-15
  • 2021-06-11
  • 2018-09-01
  • 2020-10-19
相关资源
最近更新 更多