应用的用例:
main.dart:
isApproved = false
RandomUser 提供商:
return MultiProvider(
providers: [
ChangeNotifierProvider(
create: (_) => RandomUser(),
),
ChangeNotifierProxyProvider<RandomUser, FavoriteList>(
create: (BuildContext ctx) => FavoriteList(ctx.read<RandomUser>()),
update: (_, RandomUser user, __) => FavoriteList(user),
),
收藏夹列表提供商:
class RandomUser extends ChangeNotifier {
final apiUsers = UsersApi();
UserModel? _profile;
String? _userId;
RandomUser() {
fetchUser();
}
Future<void> fetchUser() async {
await apiUsers
.apiGetUser()
.then((user) => {
_profile = user,
_userId = chosenUserId,
})
.catchError((e) {
print("error: $e");
});
notifyListeners();
}
UserModel get profile => _profile;
String get chosenUserId => _userId;
}
如您所见,class FavoriteList extends ChangeNotifier {
final RandomUser _user;
final _apiFavoriteList = FavoriteListApi();
List<FavoriteListModel> _favoriteList = <FavoriteListModel>[];
FavoriteList(this._user) {
fetchFavoriteList(_user.chosenUserId);
}
Future<void> fetchFavoriteList(String userId) async {
await _apiFavoriteList
.apiGetFavoriteList(userId)
.then((favoriteList) => {
_favoriteList = favoriteList,
})
.catchError((e) {
print("error: $e");
});
notifyListeners();
}
List<FavoriteListModel> get favoriteList => this._favoriteList;
}
需要 FavoriteList provider
来检索 getter 值 RandomUser provider
当我启动应用程序时,我立即收到错误“用于空值的空检查运算符”
在 getter chosenUserId
和 chosenUserId
中我调用 main.dart
"create"
我做错了什么?
ProxyProvider
不应该先初始化第一个 ProxyProvider
,这样我需要的所有值都可用吗?
答案 0 :(得分:1)
问题是在创建 RandomUser.fetchUser()
之前 FavoriteList
尚未完成。您应该编码允许这种情况,例如在RandomUser
:
String? get chosenUserId => _userId;
并在FavoriteList
中:
final? RandomUser _user;
FavoriteList(this._user) {
if (_user != null && _user?.chosenUserId != null) {
fetchFavoriteList(_user.chosenUserId);
}
}
String? get chosenUserId => _user?.chosenUserId;
当 fetchUser()
完成时,FavoriteList
将被更新。
当然,您的用户界面将不得不处理(临时)丢失的数据。
顺便说一句,ChangeNotifierProxyProvider 的文档建议您应该像这样构建代码:
ChangeNotifierProxyProvider<MyModel, MyChangeNotifier>(
create: (_) => MyChangeNotifier(),
update: (_, myModel, myNotifier) => myNotifier
..update(myModel),
child: ...
);
在这种情况下,如果 MyModel 要更新,则 MyChangeNotifier 将能够相应地更新。请注意 MyChangeNotifier 如何不再在其构造函数中接收 MyModel 。它现在通过自定义设置器/方法传递。