有没有一种方法可以找到对象的范围?

时间:2018-09-16 18:31:10

标签: dart flutter

我正在开发一个flutter插件,该插件在dart代码中实例化对象,以在本机端映射其他对象。我想通过在本机代码的作用域以dart代码结束后删除对象来保留内存。

1 个答案:

答案 0 :(得分: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超出范围时,垃圾收集器不会完全释放资源,而是仅在某个时间之后(或仅在应用程序终止时)释放

或者,您可以使用State对象的 didChangeDependencies deactivate 方法来管理资源。我希望可以更可靠,更及时地调用这些资源,以使其与资源的实际范围更改无关:

(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