Flutter 在Flatter中导航时未获取提供程序数据

Flutter 在Flatter中导航时未获取提供程序数据,flutter,flutter-provider,Flutter,Flutter Provider,我知道flutter提供者的范围是有限的。所以我宣布提供者(在任何地方都需要)位于MaterialApp之上。在一个屏幕中,我更改一个提供程序值并导航到另一个屏幕。在那个屏幕上,我没有得到数据。需要建议和指导我在哪里犯了错误 主飞镖 runApp( MultiProvider( providers: [ ChangeNotifierProvider<UserAuthViewModel>( create: (context) => sl<Use

我知道flutter提供者的范围是有限的。所以我宣布提供者(在任何地方都需要)位于MaterialApp之上。在一个屏幕中,我更改一个提供程序值并导航到另一个屏幕。在那个屏幕上,我没有得到数据。需要建议和指导我在哪里犯了错误

主飞镖

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();}```