【问题标题】:Flutter Bloc Rx dart combineLatest2 combine function not runningFlutter Bloc Rx dart combineLatest2 combine 功能未运行
【发布时间】:2021-09-04 00:44:42
【问题描述】:

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

我为此设置了一个新的肘:

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([],
            (previousValue, element) => [...previousValue, ...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();
  }
}

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

我需要两者的最新值同时比较它们 - 所以我认为 rx.combinelatest2 会很好。我给它从集团和腕尺的溪流。但是即使事情看起来“连线”正确,组合器功能甚至都不会运行。

非常感谢任何帮助。

【问题讨论】:

    标签: flutter flutter-bloc rxdart


    【解决方案1】:

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

    combineLatest documentation 状态:

    在所有流都发出至少一项之前,流不会发出。

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

    【讨论】:

    • 感谢您的回答。但仍然不存在 - 实际上这两个打印语句都可以正常工作并打印我期望的内容。
    • 也许您订阅的速度不够快? Cubit 的流是 BroadcastStream,这是一个热流,这意味着它会在不等待任何订阅者的情况下发出项目。
    猜你喜欢
    • 2021-04-21
    • 2021-04-14
    • 2021-03-19
    • 2022-08-05
    • 2022-01-21
    • 1970-01-01
    • 2020-10-10
    • 2021-02-04
    • 1970-01-01
    相关资源
    最近更新 更多