
[英]GetX Controller - Wait for firebase RTDB stream to be populated
[英]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.