首页 > 解决方案 > Riverpod 状态类默认值

问题描述

例如,我有ProfileModel一堆字段的类,
其中许多没有默认值,除非当我从后端获取用户信息时它们正在初始化

与riverpod我需要写一些类似的东西

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

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

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

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

这对我来说听起来很奇怪,我不想打破我的头脑去关心项目中每个模型的空状态或默认状态

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

我做错了什么或错过了什么?

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

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

标签: flutterdartriverpod

解决方案


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

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

例如,在从 API 获取模型的数据时,您可能希望在等待获取数据时具有加载状态以在 UI 中显示微调器。我写了一篇关于我使用 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;
}


推荐阅读