【问题标题】:GetX Unbind StreamGetX 解绑流
【发布时间】:2022-11-11 11:56:49
【问题描述】:

我在控制器内使用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);
 }
}

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

临时解决方案: 内部ever() 函数

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

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

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

【问题讨论】:

    标签: flutter dart firebase-realtime-database flutter-getx


    【解决方案1】:

    注意:第一个包括编辑 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));
      }
    

    现在从您的控制器中,您将能够使用cancel 方法取消存储在该列表中的streamSubscription,如下所示:

    listSubscriptions[hereIndexOfThatSubscription].cancel();
    

    然后您可以通过另一个bindStream 电话重新注​​册它

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

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

    【讨论】:

    • 感谢你的回答。方法2不起作用。而且我不想更改包源代码。必须有一种方法来重置 bindStream() 函数或更改来自 firebase 的流而不更改 Getx 包。
    【解决方案2】:

    我也遇到了这个问题,似乎没有暴露的关闭功能。不过,使用 rxdart 有另一种方法:

    import 'package:get/get.dart';
    import 'package:rxdart/rxdart.dart' hide Rx;
    
    class YourController extends GetxController {
      final value = 0.obs;
      final _closed = false.obs;
      
      void bindValue(Stream<int> valueStream) {
        _closed
          ..value = true
          ..value = false;
    
        final hasClosed = _closed.stream.where((c) => c).take(1);
        value.bindStream(
          valueStream.takeUntil(hasClosed)
        );
      }
    }
    

    每当您想解除绑定时,只需设置_closed.value = true

    【讨论】:

      猜你喜欢
      • 2022-12-09
      • 2022-01-08
      • 2021-02-13
      • 2022-08-06
      • 2023-01-15
      • 2022-12-04
      • 1970-01-01
      • 2022-08-04
      • 2012-05-30
      相关资源
      最近更新 更多