Data didn't persist after i killed the app using shared preference (flutter)

352 Views Asked by At

So i try to save user data after login to app But, after i kill the app the data didn't persist and showing null in the app

I called save data function after fetching and i don't know how or where to read the data

code to save data

class UserPreference {
  Future<bool> saveUserData(UserModel user) async {
    final prefs = await SharedPreferences.getInstance();
    prefs.setString('email', user.email);
    prefs.setString('first_name', user.first_name!);
    prefs.setString('last_name', user.last_name!);
    prefs.setString('profile_picture', user.profile_picture!);

    return true;
  }

  Future<UserModel> getUser() async {
    final SharedPreferences prefs = await SharedPreferences.getInstance();

    String email = prefs.getString('email') ?? "[email protected]";
    String first_name = prefs.getString('first_name') ?? "user";
    String last_name = prefs.getString('last_name') ?? "default";
    String profile_picture = prefs.getString('profile_picture') ?? "";
    String token = prefs.getString('token') ?? "";

    return UserModel(
      email: email,
      first_name: first_name,
      last_name: last_name,
      profile_picture: profile_picture,
      token: token,
    );
  }
}

call the save data function after fetching API

 if (response.statusCode == 200) {
      var data = jsonDecode(response.body)['data'];
      UserModel user = UserModel.fromJson(data['user']['user_customer_detail']);
      user.token = 'Bearer ' + data['access_token'];

      SharedPreferences prefs = await SharedPreferences.getInstance();
      prefs.setString('token', user.token!);
     
      UserPreference().saveUserData(user);


      return user;

code to read data in main.dart

  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  Future<UserModel>? persistData;

  @override
  void initState() {
    persistData = UserPreference().getUser();
    

    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider(
          create: (context) => AuthProvider(),
        ),
      ],
      child: MaterialApp(
        title: 'Tailorine',
        routes: {
          '/main': (context) => MainScreen(),
          '/intro': (context) => IntroScreen(),
          '/sign-in': (context) => SignInPage(),
          '/sign-up': (context) => SignUpPage(),
        },
        home: FutureBuilder(
          future: loadData(),
          builder: (c, s) {
            switch (s.connectionState) {
              case ConnectionState.none:
                return Scaffold(
                  body: Center(
                    child: Image.asset('assets/illustration/no_connection.png'),
                  ),
                );
              case ConnectionState.waiting:
                return Scaffold(
                  body: Center(
                    child: CircularProgressIndicator(
                      color: primaryColor,
                    ),
                  ),
                );

              default:
                if (s.hasError) {
                  return Center(
                    child: Text(s.error.toString()),
                  );
                } else if (s.hasData) {
                  return SplashScreen();
                } else {
                  return MainScreen();
                }
            }
          },
        ),
      ),
    );
  }
}

this code still showing null after i call data in my screen does anyone know how to fix? i use provider for state management

0

There are 0 best solutions below