各位编码员.我正在学习Riverpod州管理RN.在文档中,Riverpod的作者建议尽可能使用不变性.所以我想要管理一些复杂对象状态,我必须创建状态实例的副本.我有一些Snadbox项目来测试Riverpod的功能.有一个名为Menu(用于餐馆)的复杂对象(请参见下面的代码).我不知道如何发出新的状态,并在其中的某个深处发生一些变化.
使用冻结和FAST_IMMUTABLE_COLLECTIONS(对于IList),对吗?
@freezed
class Menu with _$Menu {
const factory Menu({
required String? currency,
required WeeklyMenu? weeklyMenu,
required StaticMenu? staticMenu,
}) = _Menu;
factory Menu.fromJson(Map<String, Object?> json) =>
_$MenuFromJson(json);
}
@freezed
class WeeklyMenu with _$WeeklyMenu {
const factory WeeklyMenu({
required IList<Day>? dayList,
}) = _WeeklyMenu;
factory WeeklyMenu.fromJson(Map<String, Object?> json) =>
_$WeeklyMenuFromJson(json);
}
@freezed
class StaticMenu with _$StaticMenu {
const factory StaticMenu({
required IList<MealGroup>? mealGroupList,
required IList<DrinkGroup>? drinkGroupList,
}) = _StaticMenu;
factory StaticMenu.fromJson(Map<String, Object?> json) =>
_$StaticMenuFromJson(json);
}
@freezed
class Day with _$Day {
const factory Day({
required String? id,
required IList<Meal>? mealList,
required bool? isChecked,
}) = _Day;
factory Day.fromJson(Map<String, Object?> json) => _$DayFromJson(json);
}
@freezed
class MealGroup with _$MealGroup {
const factory MealGroup({
required String? id,
required String? description,
required String? note,
required IList<Meal>? mealList,
required bool? isChecked,
}) = _MealGroup;
factory MealGroup.fromJson(Map<String, Object?> json) =>
_$MealGroupFromJson(json);
}
@freezed
class DrinkGroup with _$DrinkGroup {
const factory DrinkGroup({
required String? id,
required String? description,
required String? note,
required IList<Drink>? drinkList,
required bool? isChecked,
}) = _DrinkGroup;
factory DrinkGroup.fromJson(Map<String, Object?> json) =>
_$DrinkGroupFromJson(json);
}
@freezed
class Meal with _$Meal {
const factory Meal({
required String? id,
required String? name,
required String? price,
}) = _Meal;
factory Meal.fromJson(Map<String, Object?> json) => _$MealFromJson(json);
}
@freezed
class Drink with _$Drink {
const factory Drink({
required String? id,
required String? name,
required String? price,
}) = _Drink;
factory Drink.fromJson(Map<String, Object?> json) => _$DrinkFromJson(json);
}
这是MealGroup的餐单(4EX),里面有带StaticMenu子类的课程菜单(永久提供餐饮).猪肉,意大利面,素食,……),每个组都有唯一的ID,还包含具有唯一ID的班级餐列表.现在我想创建一个方法,它发出新的状态,但带有从下往下添加/更新/删除的饭菜,但我想我缺乏语法知识,也不知道如何写下来.
@riverpod
class MenuNotifier extends _$MenuNotifier {
@override
Menu build() {
return const Menu(
currency: 'Kč',
staticMenu: null,
weeklyMenu: null,
);
}
void initializeMenu() async {
final menu = await ServerHelper.initializeLocalJson();
state = menu;
}
Future<void> updateOnServer() async {
ServerHelper.sendMenuToServer(state);
}
void updateMealInMealGroup({
required String mealGroupUid,
required String mealUid,
required Meal meal,
}) {
//state = state.copyWith(staticMenu: state.staticMenu?.mealGroupList);
}
void addMealToMealGroup({
required String mealGroupUid,
required String mealUid,
required Meal meal,
}) { }
void deleteMealinMealGroup({
required String mealGroupUid,
required String mealUid,
}) { }
}
感谢您的帮助:)