我正在使用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(使用前将#替换为@)