GetX 解绑流

2024-05-12

我正在使用bindStream()函数与GetX封装在控制器内。

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);
 }
}

但是,当 groupIds 更新时FrediUserController(对于触发的函数,我想重新绑定流。意思是,删除现有的流并使用新的 id 再次绑定,或者替换已更改的流。

临时解决方案: 里面ever()功能

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

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

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


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

第一的: 查看包的源代码:

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

这是绑定流实际执行的操作,因此如果我们想要访问listSubscriptions列表,我会这样做:

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

现在您可以从您的控制器取消streamSubscription存储在该列表中cancel像这样的方法:

listSubscriptions[hereIndexOfThatSubscription].cancel();

然后你可以用另一个重新注册它bindStream call

第二 : 我相信我也见过一种叫做close()为了Rx<T>关闭订阅,但我不知道这是否有帮助

Rx<String> text = ''.obs;
text.close();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GetX 解绑流 的相关文章

随机推荐