flutter - Riverpod 状态类默认值
问题描述
例如,我有ProfileModel
一堆字段的类,
其中许多没有默认值,除非当我从后端获取用户信息时它们正在初始化
与riverpod我需要写一些类似的东西
final profileProvider = StateNotifierProvider((ref) => ProfileState());
class ProfileState extends StateNotifier<ProfileModel> {
ProfileState() : super(null);
}
我知道我需要将类似的东西传递ProfileState.empty()
给super()
方法而不是传递null
但在这种情况下,我必须为每个ProfileModel
s 字段发明默认值
这对我来说听起来很奇怪,我不想打破我的头脑去关心项目中每个模型的空状态或默认状态
在我的示例中,用户名、年龄等没有默认值,
这是纯不可变类
我做错了什么或错过了什么?
或者我可以将模型声明为可为空extends StateNotifier<ProfileModel?>
但我不确定这是不是一个好方法
解决方案
可以将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;
}
推荐阅读
- react-native - React本机IOS,当TextInput获得焦点时,按钮按下不注册
- sql - 计算多列中某个值的出现次数 - postgres
- java - Mockito 验证对模拟对象的最后一次调用
- docker - 构建时的 Docker 代理日志记录 url
- fiware-orion - NGSI 代理线云
- svg - SVG 元素的可点击超链接
- azure - 使用 Azure 数据工厂从私有 s3 实现复制数据
- javascript - 如何使用javascript获取激活的标签名称
- python - 为最小项目重命名应用程序
- java - 如何将具有复合键的键值结构映射到Java中的json对象