Flutter - ProxyProvider 如何修复错误“对空值使用空检查运算符”

时间:2021-04-21 09:27:28

标签: flutter dart flutter-provider

应用的用例:

  • 在应用程序启动时,它将从 RestAPI 中获取一个随机用户,
  • 然后它将使用第一次调用的结果进行另一个 RestAPI 调用,这就是我需要 ProxyProvider 的原因。

ma​​in.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 chosenUserIdchosenUserId 中我调用 main.dart

"create"

我做错了什么? ProxyProvider 不应该先初始化第一个 ProxyProvider,这样我需要的所有值都可用吗?

1 个答案:

答案 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 。它现在通过自定义设置器/方法传递。