【发布时间】:2020-05-13 04:40:26
【问题描述】:
我正在使用以下软件包 https://pub.dev/packages/get 。
我有以下控制器
class GroupController extends GetController{
StreamController<GroupModel> _streamController = BehaviorSubject();
Stream<GroupModel> get stream => _streamController.stream;
GroupController(DatabaseService database, GroupModel group)
{
_streamController.addStream(database.groupStream(group));
}
@override
void dispose(){
print('dispose');
_streamController.close();
super.dispose();
}
}
但是当我调用它时,永远不会调用 dispose。我这样称呼它
GetBuilder<GroupController>(
init: GroupController(database, _group),
builder: (GroupController groupController) => StreamBuilder(
stream: groupController.stream,
builder: (BuildContext context, AsyncSnapshot<GroupModel> groupSnapshot) {
我希望每当控制器从内存中删除时调用我的控制器的 dispose 方法。
我注意到 GetBuilder 有一个 dispose 回调。它需要来自小部件的状态。那么我是否需要使包含控制器的小部件成为有状态的?或者我是否需要传递一个新的状态小部件来保存状态?文档并不是全部都清楚。如何在我的控制器上调用 dispose?
我注意到每当控制器从内存中删除时都会有一个控制台日志,难道没有回调以便我可以在那里关闭流吗?我真的很想避免使小部件有状态。
编辑
class GroupController extends GetController{
StreamController<GroupModel> _streamController = BehaviorSubject();
Stream<GroupModel> get stream => _streamController.stream;
GroupController(DatabaseService database, GroupModel group)
{
_streamController.addStream(database.groupStream(group));
}
@override
void close(){
print('log if close is invoked');
_streamController.close();
super.close();
}
}
生成以下日志
I/flutter (23404): log if close is invoked
I/flutter (23404): Close can't be called
I/flutter (23404): [GET] GroupController deleted from memory
尝试关闭控制器时出现错误
【问题讨论】:
-
您希望何时调用
dispose方法? -
当小部件从内存中删除但我希望它在小部件从树中删除时发生。但总的来说,我只想知道如何利用我的 GetBuilder 的 dispose 属性。
-
没有监听器可以放在 Dart 中的类上,当对象从内存中删除时会被调用。小部件中的
dispose方法 用于将它们从小部件树中删除。 -
那么如何使用 Get 关闭流?如何使用 GetBuilder 的 dispose 属性?如果我通过 statefull 小部件的 dispose 方法,我如何引用 Controller?
-
简单的答案?你不能。 get 包中的小部件不会为清理代码公开
dispose属性,因此您无法真正轻松地做您想做的事情。不过,出于好奇,您为什么要使用 get 而不是 provider 之类的东西?