如何使用可以处理来自服务器的最新更新的 Riverpod 制作当前用户数据提供者?

时间:2021-05-29 09:24:25

标签: flutter riverpod

我是 Riverpod 状态管理的新手,如果我的问题非常基本,我很抱歉。

所以我很困惑如何制作当前用户数据提供者。比如说我有这个 User 模型

class User {
  final String uid;
  final String fullname;

  UserKM({
    required this.uid,
    required this.fullname,
  });

}

假设我有两个页面,HomePageProfilePageProfilePage 将类似于下面的代码。只是为了通过查看当前用户数据提供者使用文本显示用户全名

class ProfilePage extends ConsumerWidget {
  @override
  Widget build(context, watch) {

    final currentUser = watch(currentUserDataProvider);

    return Scaffold(
      body: Text(currentUser.fullname),
    );
  }
}

现在想象主页具有下拉刷新功能以从服务器获取最新的用户数据。

class HomePage extends ConsumerWidget {
  @override
  Widget build(context, watch) {

    final homePageController = watch(homePageControllerNotifier);

    return Scaffold(
      body: RefreshIndicator(
        onRefresh: () async => homePageController.getLatestDataFromServer(), // perform pull to refresh
        child: ,
    );
  }
}

我有一个 HomePageController,它基本上是一个像这样的更改通知器

final homePageControllerNotifier = ChangeNotifierProvider<HomePageController>((ref) {
  return HomePageController();
});

class HomePageController with ChangeNotifier {


  Future<void> getLatestDataFromServer() async {

    // perform asynchronous operation using DB service .......
    // then successfully get user data from server

    final Map<String, dynamic> userData = dataFromServer;

    // then what should I do to this latest `userData` ???
    // to make latest update also displayed in ProfilePage that listen to current user Data Provider

  }
}

我很困惑如何制作 currentUserDataProvider (将由 ProfilePage 观看/收听的提供者),因为我不知道如何将最新的 userData 从服务器放到 {{ 1}} .

所以如果我从服务器更改全名,那么用户通过pull to refresh来刷新数据,我想让最新的全名显示在currentUserDataProvider

1 个答案:

答案 0 :(得分:0)

如果您使用的是 ChangeNotifierProvider,那么您应该使用将 userData 存储在 var 中并使用 notifyListeners(); 更新它

class HomePageController with ChangeNotifier {

  Map<String, dynamic> userData?;

  Future<void> getLatestDataFromServer() async {

    // perform asynchronous operation using DB service .......
    // then successfully get user data from server

    userData = dataFromServer;

    // then what should I do to this latest `userData` ???
    // to make latest update also displayed in ProfilePage that listen to current user Data Provider
    notifyListeners();
  }
}

然后您可以像这样定义您的 currentUserDataProvider

final currentUserDataProvider = Provider<Map<String, dynamic>?>((ref) {
  final homePageController = ref.watch(homePageControllerNotifier);
  return homePageController.userData;
}

虽然这样做有效,但我建议将 StateNotifier 与自定义状态类一起使用,这样可以避免每次更新时都使用 notifyListeners();