[英]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.