簡體   English   中英

如何使用可以處理來自服務器的最新更新的 Riverpod 制作當前用戶數據提供者?

[英]how to make current user data provider using Riverpod that can handle latest update from Server?

我是Riverpod state 管理的新手,如果我的問題非常基本,我很抱歉。

所以我很困惑如何制作當前的用戶數據提供者。 比如說我有這個User model

class User {
  final String uid;
  final String fullname;

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

}

假設我有兩個頁面, HomePageProfilePage 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 從服務器放入currentUserDataProvider

所以如果我從服務器更改全名,然后用戶通過拉刷新數據刷新,我想讓最新的全名顯示在ProfilePage

如果您使用的是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與自定義 state class 一起使用,從而避免使用notifyListeners(); 每次有更新。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM