微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Flutter Bloc Rx dart combineLatest2 组合功能未运行

如何解决Flutter Bloc Rx dart combineLatest2 组合功能未运行

我正在编写 Flutter 应用程序并使用 bloc 库。我有一个 bloc 和一个 cubit,在每个状态中是我需要从 firestore 获取的其他一些文档的 ID 列表。可能会有一些重叠,并且已经提取了一些文档,所以我想从两个状态中获取 id 列表,比较它们,然后只去 firestore 中存在一个但没有另一个的那些。

我为此设置了一个新肘:

class CircleRecipesCubit extends Cubit<CircleRecipesstate> {
  CircleRecipesCubit({
    @required RecipesBloc recipesBloc,@required CirclesCubit circlesCubit,})  : assert(
          recipesBloc != null,circlesCubit != null,),_recipesBloc = recipesBloc,_circlesCubit = circlesCubit,super(CircleRecipesInitial());

  final RecipesBloc _recipesBloc;
  final CirclesCubit _circlesCubit;

  StreamSubscription _recipesSubscription;
  StreamSubscription _circlesSubscription;

  Future<void> getCircleRecipes() async {
    // get a list of recipes the user already has loaded
    List<String> userRecipesIds;
    _recipesSubscription = _recipesBloc.stream.listen((Recipesstate event) {
      if (event is RecipesLoaded) {
        userRecipesIds = event.recipes.map((e) => e.id).toList();
        print('*');
        print(userRecipesIds);
        print('*');
      }
    });

    // get a list of recipes in the circles
    List<String> circleRecipeIds;
    _circlesSubscription = _circlesCubit.stream.listen((Circlesstate event) {
      if (event is CirclesLoaded) {
        circleRecipeIds = event.circles.fold([],(prevIoUsValue,element) => [...prevIoUsValue,...element.recipes]);

        print('|');
        print(circleRecipeIds);
        print('|');
        // List<String> circleOnlyRecipeIds = circleRecipeIds;
        // circleRecipeIds.removeWhere((e) => userRecipesIds.contains(e));
        // print(circleOnlyRecipeIds);
      }
    });

    // reduce the list of recipes to a set of only circle recipes
    //Todo

    //------- Try with RX dart

    Stream<Recipesstate> recipesstream = _recipesBloc.stream;
    Stream<Circlesstate> circlesstream = _circlesCubit.stream;
    Rx.combineLatest2(recipesstream,circlesstream,(
      Recipesstate recipesstate,Circlesstate circlesstate,) {
      print("This doesn't print!");
      print(recipesstate);
      print(circlesstate);

      if (recipesstate is RecipesLoaded) {
        userRecipesIds = recipesstate.recipes.map((e) => e.id).toList();
        print('*');
        print(userRecipesIds);
        print('*');
      }
      if (circlesstate is CirclesLoaded) {
        circleRecipeIds = circlesstate.circles.fold([],...element.recipes]);

        print('|');
        print(circleRecipeIds);
        print('|');
        // List<String> circleOnlyRecipeIds = circleRecipeIds;
        // circleRecipeIds.removeWhere((e) => userRecipesIds.contains(e));
        // print(circleOnlyRecipeIds);

      }
      // fetch the set of recipes
    });
  }

  @override
  Future<void> close() {
    _recipesSubscription.cancel();
    _circlesSubscription.cancel();
    return super.close();
  }
}

所以上面是我的肘 - 它听 recipesBloc 和 circlesCubit。 getCiricleRecipes() 函数中的前两个表达式只是为了证明它正确连接 - 当它运行那些 print 语句时,会打印我希望它从另一个 bloc 和另一个 cubit 打印的 ID。

我同时需要两者的最新值来比较它们 - 所以我认为 rx.combinelatest2 会很好。我给它来自集团和肘的流。但是,即使看起来“连接”正确,组合器功能也无法运行。

非常感谢任何帮助。

解决方法

确保两个流都至少发出了一项。

combineLatest documentation 声明:

直到所有流都发出至少一项后,Stream 才会发出。

由于第一个块(您订阅 _circlesCubit 的地方)打印,那么很可能 _recipesBloc 是这里的罪魁祸首。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。