我是 Riverpod 状态管理的新手,如果我的问题非常基本,我很抱歉。
所以我很困惑如何制作当前用户数据提供者。比如说我有这个 User
模型
class User {
final String uid;
final String fullname;
UserKM({
required this.uid,
required this.fullname,
});
}
假设我有两个页面,HomePage
和 ProfilePage
。 ProfilePage
将类似于下面的代码。只是为了通过查看当前用户数据提供者使用文本显示用户全名
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
答案 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();
。