如何解决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 举报,一经查实,本站将立刻删除。