我正在使用以下包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();
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我调用它时,永远不会调用 dispose。我这样称呼它
GetBuilder<GroupController>(
init: GroupController(database, _group),
builder: (GroupController groupController) => StreamBuilder(
stream: groupController.stream,
builder: (BuildContext context, AsyncSnapshot<GroupModel> groupSnapshot) {
Run Code Online (Sandbox Code Playgroud)
我希望每当控制器从内存中删除时就调用控制器的 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();
}
}
Run Code Online (Sandbox Code Playgroud)
生成如下日志
I/flutter (23404): log if close is invoked
I/flutter (23404): Close can't be called
I/flutter (23404): [GET] GroupController deleted from memory
Run Code Online (Sandbox Code Playgroud)
尝试关闭控制器时不知何故出错
如果您将“dispose”插入到 GetController 中,它将被忽略。这是因为 dispose 是一种用于丢弃 StatefulWidget 类中的 widget 的方法,而不是用于丢弃控制器的方法,尤其是因为 Get 会在不再需要时自动且智能地丢弃控制器以释放资源。如果您想关闭流,只要将流插入到 onClose 方法中,Get 就会自动执行此操作。
class GroupController extends GetxController {
StreamController<GroupModel> _streamController = BehaviorSubject();
Stream<GroupModel> get stream => _streamController.stream;
GroupController(DatabaseService database, GroupModel group);
@override
void onInit() {
_streamController.addStream(database.groupStream(group));
super.onInit();
}
// this
@override
void onClose() {
print('dispose');
_streamController.close();
super.onClose();
}
}
Run Code Online (Sandbox Code Playgroud)
如果您使用的是旧版本的 Get,则可以手动使用相同的 close 和 close 方法:
GetBuilder<GroupController>(
init: GroupController(database, _group),
builder: (GroupController groupController) => StreamBuilder(
stream: groupController.stream,
builder: (BuildContext context, AsyncSnapshot<GroupModel> groupSnapshot) {
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7758 次 |
| 最近记录: |