Flutter 在Flatter中导航时未获取提供程序数据
我知道flutter提供者的范围是有限的。所以我宣布提供者(在任何地方都需要)位于MaterialApp之上。在一个屏幕中,我更改一个提供程序值并导航到另一个屏幕。在那个屏幕上,我没有得到数据。需要建议和指导我在哪里犯了错误 主飞镖Flutter 在Flatter中导航时未获取提供程序数据,flutter,flutter-provider,Flutter,Flutter Provider,我知道flutter提供者的范围是有限的。所以我宣布提供者(在任何地方都需要)位于MaterialApp之上。在一个屏幕中,我更改一个提供程序值并导航到另一个屏幕。在那个屏幕上,我没有得到数据。需要建议和指导我在哪里犯了错误 主飞镖 runApp( MultiProvider( providers: [ ChangeNotifierProvider<UserAuthViewModel>( create: (context) => sl<Use
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider<UserAuthViewModel>(
create: (context) => sl<UserAuthViewModel>()),
ChangeNotifierProvider<UserProfileViewModel>(
create: (context) => sl<UserProfileViewModel>()),
ChangeNotifierProvider<BottomNavViewModel>(
create: (context) => sl<BottomNavViewModel>()),
],
child: MaterialApp(
title: "Footsapp",
theme: ThemeData(fontFamily: 'Montserrat'),
debugShowCheckedModeBanner: false,
home: isFirstLaunch == true ? OnBoarding() : SplashView(),
routes: {
//onboarding
SplashView.SCREEN_ID: (context) => SplashView(),
//bottom nav pages
BottomNavContainer.SCREEN_ID: (context) => BottomNavContainer(),
},
),
),
);
runApp(
多供应商(
供应商:[
变更通知提供者(
create:(context)=>sl()),
变更通知提供者(
create:(context)=>sl()),
变更通知提供者(
create:(context)=>sl()),
],
孩子:MaterialApp(
标题:“Footsapp”,
主题:主题数据(fontFamily:“蒙特塞拉特”),
debugShowCheckedModeBanner:false,
主页:isFirstLaunch==true?入职():SplashView(),
路线:{
//入职
SplashView.SCREEN_ID:(上下文)=>SplashView(),
//底部导航页面
BottomNavContainer.SCREEN_ID:(上下文)=>BottomNavContainer(),
},
),
),
);
从api调用获取一些信息的启动屏幕
class _SplashViewState extends State<SplashView>
with TokenProvider, AfterLayoutMixin<SplashView> {
final userProfileViewModel = sl<UserProfileViewModel>();
final prefUtil = sl<SharedPrefUtil>();
@override
void afterFirstLayout(BuildContext context) {
Future.delayed(Duration(seconds: 1), () async {
bool isLoggedIn = prefUtil.readBool(IS_LOGGED_IN) ?? false;
bool initialProfileUpdated =
prefUtil.readBool(INITIAL_PROFILE_UPDATED) ?? false;
isLoggedIn == true
? getProfileInfo()
: await Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(
builder: (_) => SocialLoginRegScreen(),
),
(route) => false);
});
}
@override
void initState() {
super.initState();
}
void getProfileInfo() async {
final userProfileResponse = await userProfileViewModel.getUserProfileData();
if (userProfileResponse.success == true) {
print('In splash: ${userProfileViewModel.userProfile.toString()}');
//from log
In splash: {firstName: Ashif, lastName: 123, birthday: 1990-02-03, email:
ashif123@gmail.com, preferredFoot: Left, preferredPosition: Midfielder,
numberOfTimesPlayedWeekly: 4}
Future.delayed(Duration(milliseconds: 500), () async {
await Navigator.pushReplacementNamed(
context,
BottomNavContainer.SCREEN_ID,
);
});
}
}
class\u SplashViewState扩展状态
使用TokenProvider,AfterLayoutMixin{
最终userProfileViewModel=sl();
final prefUtil=sl();
@凌驾
void afterFirstLayout(BuildContext上下文){
延迟(持续时间(秒:1),()异步{
bool isLoggedIn=prefUtil.readBool(是否已登录)??错误;
布尔初始配置文件已更新=
prefUtil.readBool(初始配置文件更新)??错误;
isLoggedIn==true
?getProfileInfo()
:等待Navigator.pushandremove直到(
上下文
材料路线(
生成器:(\u)=>SocialLogScreen(),
),
(路由)=>错误);
});
}
@凌驾
void initState(){
super.initState();
}
void getProfileInfo()异步{
final userProfileResponse=等待userProfileViewModel.getUserProfileData();
if(userProfileResponse.success==true){
打印('In splash:${userProfileViewModel.userProfile.toString()}');
//从日志
在splash中:{firstName:Ashif,lastName:123,生日:1990-02-03,电子邮件:
ashif123@gmail.com,首选脚:左,首选位置:中场,
每周播放的次数:4}
延迟(持续时间(毫秒:500),()异步{
等待Navigator.pushReplacementNamed(
上下文
BottomNavContainer.SCREEN_ID,
);
});
}
}
提供者模型类
class UserProfileViewModel extends BaseViewModel {
final _profileManageRepo = sl<ProfileManageRepo>();
Profile userProfile = Profile.initial();
Future<UserDataResponse> getUserProfileData() async {
final _userDataResponse = await _profileManageRepo.getUserProfileInfo();
if (_userDataResponse.success == true) {
userProfile = _userDataResponse.profile;
} else {
setState(ViewState.Error);
errorMessage = 'Please try again!';
}
return _userDataResponse;
}
类UserProfileViewModel扩展了BaseViewModel{
最终_profileManageRepo=sl();
Profile userProfile=Profile.initial();
未来的getUserProfileData()异步{
final _userDataResponse=wait _profileManageRepo.getUserProfileInfo();
if(_userDataResponse.success==true){
userProfile=\u userDataResponse.profile;
}否则{
设置状态(ViewState.Error);
errorMessage='请重试!';
}
返回_userDataResponse;
}
我试图从配置文件屏幕获取提供商数据(用户配置文件)。但它总是获取初始值
class _UserProfileScreenState extends State<UserProfileScreen> {
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return Consumer<UserProfileViewModel>(
builder: (context, viewmodel, child) {
print('In profile: ${viewmodel.userProfile.toString()}');
//but here
In profile: {firstName: , lastName: , birthday: , email: , preferredFoot:
Left, preferredPosition: , numberOfTimesPlayedWeekly: 1(default value)}
return Container(
child: ProfileCardWidget(
profile: viewmodel.userProfile,
),
);
},
);
}
}
class\u UserProfileScreenState扩展状态{
@凌驾
void initState(){
super.initState();
}
@凌驾
小部件构建(构建上下文){
退货消费者(
生成器:(上下文、视图模型、子对象){
打印('In profile:${viewmodel.userProfile.toString()}');
//但是这里
在配置文件中:{firstName:,lastName:,生日:,电子邮件:,preferredFoot:
左,首选位置:,numberOfTimesPlayedWeekly:1(默认值)}
返回容器(
子:ProfileCardWidget(
profile:viewmodel.userProfile,
),
);
},
);
}
}
什么是“不获取数据”意思?这意味着当设置数据时,我打印提供程序值。它打印来自api和set的数据。如名字、姓氏。再次在Userprofile屏幕中导航后,我打印值。它打印初始值(默认空字符串值)@RémiRousselet还编辑了带有打印值的问题BaseViewModel是否有这样的Mixin运算符?带有ChangeNotifieries的class BaseViewModel。`` class BaseViewModel扩展了ChangeNotifier{ViewState _state=ViewState.Initial;ViewState get state=>\u state;String errorMessage='';void setState(ViewState ViewState){{u state=viewState;notifyListeners();}```