有没有办法找到一个对象的范围?

问题描述 投票:0回答:1

我正在开发一个flutter插件,它实例化dart代码中的对象,映射本机端的其他对象。我希望通过在本机代码的范围以dart代码结束时删除对象来保留内存。

dart flutter
1个回答
1
投票

如果你对使用flutter框架管理资源很好,你可以将它们包装在State Object中。 https://docs.flutter.io/flutter/widgets/State-class.html一旦从窗口小部件树中永久删除引用的有状态窗口小部件,框架就会调用dispose()。

(1)易于实施 - 无法控制

class ResourceManager extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => ResourceManagerState();
}

class ResourceManagerState extends State<ResourceManager>{
  Resource referenceToResource;
  @override
  void initState() {
    // create/open your unmanaged resource here
    super.initState();
  }

  @override
  void dispose() {
    // close/destroy your resource here
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return SomeWidgetThatUsesTheResource();
  }
}

如果您需要更多地控制资源,事情会变得更加复杂。当Widget超出范围但仅在某个时间之后(或者仅在应用程序终止时),垃圾收集器不会准确释放资源

或者,您可以使用didChangeDependencies管理资源并停用State对象的方法。我希望在资源的实际范围变化时更加可靠和更接近地调用它们:

(2)仍然简单 - 稍微控制一下

class ResourceManager extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => ResourceManagerState();
}

class ResourceManagerState extends State<ResourceManager>{
  Resource referenceToResource;

  @override
  void didChangeDependencies() {
    if(referenceToResource = null) {
      // open/create resource here
    }
    super.didChangeDependencies();
  }

  @override
  void deactivate() {
    // close/destroy your resource here
    super.deactivate();
  }

  @override
  Widget build(BuildContext context) {
    return SomeWidgetThatUsesTheResource();
  }
} 

(3)需要一些工作 - 甚至更多的控制

如果您需要可靠地管理有限数量的资源,您可以查看Flutter的池插件:https://pub.dartlang.org/packages/pool

© www.soinside.com 2019 - 2024. All rights reserved.