各位编码员.我正在学习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,
  }) {  }
}

感谢您的帮助:)

推荐答案

如果你以Freezed: Going further: Deep copy项为指导,那么总体上应该没有问题.一切都是极其不变的:)

Flutter相关问答推荐

在Flutter 动中绘制ECG图

无法将Flutter 连接到Firebase

CLI数据库连接后将SHA-1密钥添加到Firebase项目

将Riverpods NotifierProvider与State类一起使用

使用Ffltter CREATE创建项目时,androidManifest.xml中缺少包属性

没有为类型 'Widget' 定义运算符 '[]' .try 定义运算符[]

为 flutter app/firebase 保存 chatgpt api-key 的正确方法是什么

#Flutter/Riverpod - 使用 AsyncNotifier 时是否可以仅调用错误?

我对 Flutter Apk 有疑问

什么最接近 Dart 的 List.asMap().forEach() 返回列表?

flutter 中 // 和 /// 有什么区别

如何将金钱格式化为数以百万计的Flutter 动?

String类型不是Widget类型的子类型?在dart 中

Flutter 错误:正文可能正常完成,导致返回null

如何在 Flutter 中使用简写 IF 禁用单选按钮?

我一直在try 创建按钮以导航到第二页,但不知何故 RaisedButton 功能无法正常工作

http响应在Flutter 中返回307

Flutter:滚动一个ListWheelScrollView,无法获取选中项的状态

这在Flutter 的 pubspec 文件中是什么意思?

在Flutter 中将数字转换为印度文字样式