Riverpod 状态 class 默认值

Riverpod state class default value

例如我有 class ProfileModel 和一堆字段
他们中的许多人没有默认值,除非他们在我从后端获取用户信息时进行初始化

对于 riverpod,我需要写一些像

final profileProvider = StateNotifierProvider((ref) => ProfileState());

class ProfileState extends StateNotifier<ProfileModel> {
  ProfileState() : super(null);
}

我知道我需要将 ProfileState.empty() 之类的东西传递给 super() 方法,而不是传递 null

但在这种情况下,我必须为每个 ProfileModels 字段发明默认值

这对我来说听起来很奇怪,我不想为了关心项目中每个模型的空状态或默认状态而伤脑筋

在我的示例中,用户名、年龄等没有默认值
这是纯粹的不可变 class

我做错了什么或遗漏了什么?

或者我可以将模型声明为可为空 extends StateNotifier<ProfileModel?>

但我不确定这是不是一个好方法

可以将 StateNotifier 与可空模型一起使用。如果您在语义上想要表明该值实际上可能不存在,我会说 null 没问题。

但是,我通常做的和我认为更好的是创建一个状态模型,其中包含模型,以及与应用程序可能处于的不同状态相关的属性。

例如,在从 API 获取模型数据时,您可能希望在等待获取数据时有一个加载状态以在 UI 中显示微调器. I wrote an article about the architecture that I apply using Riverpod.

状态模型的一个简单示例是:

class ProfileState {
  final ProfileModel? profileData;
  final bool isLoading;

  ProfileState({
    this.profileData,
    this.isLoading = false,
  });

  factory ProfileState.loading() => ProfileState(isLoading: true);

  ProfileState copyWith({
    ProfileModel? profileData,
    bool? isLoading,
  }) {
    return ProfileState(
      profileData: profileData ?? this.profileData,
      isLoading: isLoading ?? this.isLoading,
    );
  }

  @override
  bool operator ==(Object other) {
    if (identical(this, other)) return true;

    return other is ProfileState &&
        other.profileData == profileData &&
        other.isLoading == isLoading;
  }

  @override
  int get hashCode => profileData.hashCode ^ isLoading.hashCode;
}