当我的 Get Controller 从内存中删除时,如何关闭流?

Mik*_*ink 4 dart flutter

我正在使用以下包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)

尝试关闭控制器时不知何故出错

jon*_*ges 6

如果您将“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)