【问题标题】:Flutter: Do I need to call GestureRecognizer.dispose in StatelessWidget (TextSpan/recognizer)?Flutter:我需要在 StatelessWidget(TextSpan/recognizer)中调用 GestureRecognizer.dispose 吗?
【发布时间】:2018-12-13 10:37:12
【问题描述】:

我正在阅读此文档页面:https://docs.flutter.io/flutter/painting/TextSpan/recognizer.html

此页面中包含的示例是 StatefulWidget,文档中显示为 The code that owns the GestureRecognizer object must call GestureRecognizer.dispose when the TextSpan object is no longer used.

我想知道我是否可以在 StatelessWidget 中使用TextSpanrecognizer

如果是这样,我需要在某处致电dispose 吗?我不知道在哪里称呼它。

非常感谢。

【问题讨论】:

    标签: flutter


    【解决方案1】:

    您不能在StatelessWidget 中这样做。您必须将其转换为 StatefulWidget 并覆盖 Statedispose 方法:

    class Foo extends StatefulWidget {
      @override
      _FooState createState() => _FooState();
    }
    
    class _FooState extends State<Foo> {
      GestureRecognizer gestureRecognizer;
    
      @override
      void dispose() {
        gestureRecognizer?.dispose();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return Container();
      }
    }
    

    【讨论】:

    • 如果我在 StatelessWidget 中使用它会发生什么?我在当前代码的无状态小部件中使用它,它工作正常,我根本没有发现任何问题。这会导致内存泄漏吗?
    • 是的,你会有内存泄漏。
    • 非常感谢您的提示。 (1) 但除了概念之外,我如何测试这是否真的导致内存泄漏?有什么简单的方法可以证明吗?否则,我不得不盲目相信这一点。 (2)InkWell等其他可点击的小部件呢?他们必须放在 StatefulWidget 里面吗?如果不是,为什么GestureRecognizer 如此不同?我对此非常好奇,因为我几乎从不使用任何 StatefulWidget。我正在关注 bloc 状态管理,所以我的所有小部件都是无状态的 StreamBuilder。再次感谢。
    • 非常感谢您的回答和cmets。我已将其标记为答案。关于 dispose 问题,因为我只能在 90 分钟内提出一个新问题。所以我必须等待 90 分钟才能创建另一个。 90m 后,我将创建一个新问题并将链接放在这里。如果你有时间,请在新问题中告诉我一些方向。再次非常感谢您。
    • 我创建了一个新问题:stackoverflow.com/questions/53773248你有时间可以看看。我知道这个问题非常复杂,需要很长时间才能回答。谢谢。
    猜你喜欢
    • 2020-08-09
    • 2021-06-24
    • 2021-06-03
    • 2021-02-06
    • 2010-12-07
    • 2011-11-20
    • 1970-01-01
    • 2019-09-23
    • 2019-08-02
    相关资源
    最近更新 更多