例如,我有一个带有一堆字段的类ProfileModel
其中许多字段没有默认值,除非当我从后端获取用户信息时它们正在初始化
使用riverpod,我需要写一些类似的东西
final profileProvider = StateNotifierProvider((ref) => ProfileState());
class ProfileState extends StateNotifier<ProfileModel> {
ProfileState() : super(null);
}
我知道我需要将类似ProfileState.empty()
的东西传递到super()
方法中,而不是传递null
但在这种情况下,我必须为每个ProfileModel
s字段创建默认值
这对我来说听起来很奇怪,我不想因为关心项目中每个模型的空状态或默认状态而伤透脑筋
在我的示例中,用户名、年龄等没有默认值
这是纯不可变的类
我做错了什么或错过了什么?
或者我可以将模型声明为可为null的extends StateNotifier<ProfileModel?>
但我不确定这是的好方法吗
可以将StateNotifier
与可为null的模型一起使用。如果你想在语义上表明这个值实际上是不存在的,我会说有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;
}