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