Not getting provider data when navigating in flutter

Viewed 301

I know flutter provider is scoped. So I declared providers (those will be needed everywhere) top of MaterialApp. In a screen am chaning a provider value and navigating to another screen. In that screen am not getting the data. Need suggestions and guide where I have done the mistake

main.dart

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

splash screen where getting some info from api call

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,
    );
  });
}
}

provider model class

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;
}

Am trying to get the provider data (user profile) from Profile Screen. But it always get initial value.

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,
      ),
    );
  },
 );
 }
}
0 Answers
Related