繁体   English   中英

GetX 解除绑定 Stream

[英]GetX Unbind Stream

我在 controller 中使用bindStream() function 和GetX package。

class FrediUserController extends GetxController {    
@override
void onReady() {
    super.onReady();
    final userController = Get.find<FrediUserController>();
    var groupIds = userController.user.groups;
    groupList.bindStream(DatabaseManager().groupsStream(groupIds));
    ever(groupList, everCallback);
 }
}

但是,当 FrediUserController 中的FrediUserController更新时(有一个被触发的 function,我想重新绑定流。意思是,删除现有的流并用新的 ID 再次绑定,或者替换已更改的流。

临时解决方案:Inside ever() function

Get.delete<FrediGroupController>();
Get.put(FrediGroupController());

每次我的groupIds从数据库更改时,都会运行此代码。 但我不想每次发生小变化时都启动我的控制器,这是糟糕的用户体验。

这似乎很难,有人可以指导我正确的方向吗? 也许有一种完全不同的方法来连接两个 GetX 控制器?

注意:第一个包括编辑 Getx package 的源代码。

首先:查看 package 的源代码:

  void bindStream(Stream<T> stream) {
     final listSubscriptions =
    _subscriptions[subject] ??= <StreamSubscription>[];
    listSubscriptions.add(stream.listen((va) => value = va));
  }

这是绑定 stream 实际所做的,所以如果我们想访问listSubscriptions列表,我会这样做:

 final listSubscriptions;
void bindStream(Stream<T> stream) {
     listSubscriptions =
    _subscriptions[subject] ??= <StreamSubscription>[];
    listSubscriptions.add(stream.listen((va) => value = va));
  }

现在从您的 controller 中,您将能够使用如下cancel方法取消存储在该列表中的streamSubscription

listSubscriptions[hereIndexOfThatSubscription].cancel();

然后您可以使用另一个bindStream调用再次重新注册它

第二:我相信我也看到了一个名为close()的方法,用于Rx<T>关闭订阅,但我不知道它是否有帮助

Rx<String> text = ''.obs;
text.close();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM