gpt4 book ai didi

Flutter 等待 Provider 在 multiprovider 中准备就绪

转载 作者:行者123 更新时间:2023-12-04 10:26:58 27 4
gpt4 key购买 nike

我在同步提供程序创建时遇到问题。我是 Flutter 的新手,我会尽力解释得更好。

在我的 main.dart 中,我有两个提供程序,一个用于用户身份验证,一个用于代码中的另一个小部件,它只是有一个要显示的列表。我使用 ChangeNotifierProxyProvider,因为所有其他提供商都需要访问用户身份验证 token 和详细信息。用户存储、读取 token 的所有方法都在 userProvider 中。

当调用 UserProvder.init() 时,对象已创建但由于 http 请求仍未准备就绪,主代码中的代码继续执行并将 UserProvider 传递给认为 UserProvider 已准备就绪的 Conto Provider 但它是不是。当 ContoProvider 开始使用 UserProvider 中的 token 检索列表时,通过 userService 访问失败了调用,因为它仍然为 null。

那么,我怎样才能同步提供者的创建,以便等待 UserProvider 完全准备好,然后初始化所有其他提供者?

主.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 调用。您可以将此类作为参数传递给您的提供者。

关于Flutter 等待 Provider 在 multiprovider 中准备就绪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60597905/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com