簡體   English   中英

Flutter 等待 Provider 在 multiprovider 中准備就緒

[英]Flutter await Provider to be ready inside multiprovider

我在同步提供者創建時遇到問題。 我是顫振的新手,我會盡量解釋得更好。

在我的 main.dart 中,我有兩個提供程序,一個用於用戶身份驗證,另一個用於代碼中的另一個小部件,它只需要顯示一個列表。 我使用 ChangeNotifierProxyProvider 因為所有其他提供者都需要訪問用戶身份驗證令牌和詳細信息。 用戶存儲、讀取令牌的所有方法都在 userProvider 中。

當調用 UserProvder.init() 時,對象已創建但由於 http 請求仍未准備好,主程序中的代碼繼續執行並將 UserProvider 傳遞給認為 UserProvider 已准備好但尚未准備好的 Conto Provider。 當 ContoProvider 開始使用 UserProvider 內部的令牌檢索 List 時,通過 userService 訪問失敗,因為它仍然為空。

那么,我如何同步提供者的創建以等待 UserProvider 完全准備好然后初始化所有其他提供者?

main.dart

Widget build(BuildContext context) {
return MultiProvider(
  providers: [
    ChangeNotifierProvider<UserProvider>(
      create:  (_)  => UserProvider.init(),

    ),
    ChangeNotifierProxyProvider<UserProvider, ContoProvider>(
      create: (_) {
        return ContoProvider.init(
            Provider.of<UserProvider>(_, listen: false));
        },

      update: (_,  userProvider,  contoProvider) =>
          contoProvider..update(userProvider),
    ),
  ],
  child:... 

userProvider.dart

      User activeUser = User(null, null, null);
      UserStatus status = UserStatus.Checking;


        UserProvider.init() {

            checkUserPresence();
          }

          void checkUserPresence() async {
             /*here i check if in secure storage there is a refreshtoken if there is i make an http
 request for a new token and a second request to fill the User into UserProvider so i need await async*/
          }

ContoProvider.dart

    UserProvider userService;
      ContoProvider.init(UserProvider user) {

        userService = user;

        lookUpConti();
      }

      void lookUpConti() async {
        /*here i make an http call to retrive some data, i access to 
userService for get token and refresh token if needed*/
    }

您可以使用WidgetsFlutterBinding.ensureInitialized()

void main() {

  /** WidgetsFlutterBinding.ensureInitialized() is required in Flutter v1.9.4+ before using any plugins if the code is executed before runApp. */

  WidgetsFlutterBinding.ensureInitialized();



  runApp(
    MultiProvider(
      providers: [
         ChangeNotifierProvider<UserProvider>(
           create:  (_)  => UserProvider.init()),

         ChangeNotifierProxyProvider<UserProvider, ContoProvider>(
            create: (_) {
               return ContoProvider.init(
                   Provider.of<UserProvider>(_, listen: false));
             },

           update: (_,  userProvider,  contoProvider) =>
             contoProvider..update(userProvider),
         ),
       ],
      child: MyApp(),
    ),

}

PS :我建議您將存儲庫與提供商分開。 也就是說,不應在您的提供者中找到對外部/網絡資源的 API 調用。 您可以將此類類作為參數傳遞給您的提供者。

暫無
暫無

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

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