【发布时间】: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