Flutter 颤振等待供应商在多供应商内部准备就绪
我在创建同步提供程序时遇到问题。 我是个新手,我会尽力解释得更好 在my main.dart中,我有两个提供程序,一个用于用户身份验证,另一个用于代码中的小部件,它只是有一个要显示的列表。 我使用ChangeNotifierProxyProvider,因为所有其他提供程序都需要访问用户身份验证令牌和详细信息。用户存储、读取令牌的所有方法都在userProvider中 调用UserProvider.init()时,对象已创建,但由于http请求而尚未准备就绪,main中的代码将继续执行,并将UserProvider传递给认为UserProvider已准备就绪但尚未准备就绪的Conto提供程序。当ContoProvider开始检索带有UserProvider内令牌的列表时,通过userService访问UserProvider失败,因为仍然为null 那么,如何同步提供程序的创建,以等待UserProvider完全就绪,然后初始化所有其他提供程序 主飞镖Flutter 颤振等待供应商在多供应商内部准备就绪,flutter,flutter-provider,flutter-change-notifier,Flutter,Flutter Provider,Flutter Change Notifier,我在创建同步提供程序时遇到问题。 我是个新手,我会尽力解释得更好 在my main.dart中,我有两个提供程序,一个用于用户身份验证,另一个用于代码中的小部件,它只是有一个要显示的列表。 我使用ChangeNotifierProxyProvider,因为所有其他提供程序都需要访问用户身份验证令牌和详细信息。用户存储、读取令牌的所有方法都在userProvider中 调用UserProvider.init()时,对象已创建,但由于http请求而尚未准备就绪,main中的代码将继续执行,并将Use
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:...
飞镖
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*/
}
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(){
/**如果代码在runApp之前执行,则在使用任何插件之前,颤振v1.9.4+中需要WidgetsFlutterBinding.ensureInitialized()*/
WidgetsFlutterBinding.ensureInitialized();
runApp(
多供应商(
供应商:[
变更通知提供者(
创建:()=>UserProvider.init()),
ChangeNotifierProxyProvider(
创建:(){
return ContoProvider.init(
(u,listen:false))的提供者;
},
更新:(551;,用户提供者,contoProvider)=>
contoProvider..更新(用户提供程序),
),
],
子项:MyApp(),
),
}
PS:我建议您将存储库与提供商分开。也就是说,不应在提供商中找到对外部/web资源的API调用。您可以将此类类作为参数传递给提供商。是的,您对体系结构的看法绝对正确。在这个月里,我学到了很多,并更改了我的架构cture多次。谢谢你的回复:)不客气。如果是这样的话,请把它标记为正确,我将不胜感激。
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(),
),
}