如何使用 Riverpod 打开页面时进行多个异步调用?

Agu*_*ana 5 flutter riverpod

当我的应用程序的用户打开主页时,我需要对服务器进行两次异步调用

首先,我需要获取当前用户数据。然后根据当前的用户数据,我需要获取他最喜欢的餐厅。

我有两种不同的方法从服务器获取这些数据

class MyAPI {

   Future<User> getUserData() async {}

   Future<List<Restaurant>> getUserData() async {}

}
Run Code Online (Sandbox Code Playgroud)

那么如何使用 Riverpod 在我的主页中构建这 2 个异步方法?

  1. 显示圆形加载指示器
  2. 进行这 2 个异步调用
  3. 隐藏圆形加载指示器并加载 lisView

我从 Riverpod 了解到 FutureProvider,但 FutureProvider 仅适用于一种异步服务,对吗?

我是否需要先以某种方式将这两个方法组合成一个方法,然后使用 FutureBuilder?或者是另一种更常用的方式?我不知道

如何解决这个问题。抱歉,我是 Flutter 的初学者

mou*_*lte 8

这看起来像 stateNotifier 的用例:首先在数据模型中定义一个 UserData 类:

class UserData{
  final User user;
  final List<Restaurant> restaurants;
  UserData(this.user, this.restaurants)
}
Run Code Online (Sandbox Code Playgroud)

接下来定义一个状态及其关联的 stateNotifierProvider :

final userDataProvider = StateNotifierProvider<UserDataNotifier, AsyncValue<UserData>>((ref) => UserDataNotifier());
class UserDataNotifier extends StateNotifier<AsyncValue<UserData>> {
  UserDataNotifier() : super(AsyncValue.loading()){
    init();
  }
  final _api = MyAPI();
  void init() async {
    state = AsyncValue.loading();
    try {
      final user = await _api.getUser;
      final List<Restaurant> restaurants = await _api.getFavoriteRestaurant(user);
      state = AsyncValue.data(UserData(user,restaurants));
    } catch (e) {
      state = AsyncValue.error(e);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

最后在你的用户界面中使用消费者:

Consumer(builder: (context, watch, child) {
  return watch(userDataProvider).when(
      loading: ()=> CircularProgressIndicator(),
      error: (error,_) =>
            Center(child: Text(error.toString())),
      data: (data) => Center(child: Text(data.toString())));
})
Run Code Online (Sandbox Code Playgroud)