Flutter read shared preferences in main then decide which startup page?
Load the Homepage and if the user is not logged in, then replace it with your LoginPage()
@override
void initState() {
super.initState();
checkIsLogin();
}
Future<Null> checkIsLogin() async {
String _token = "";
SharedPreferences prefs = await SharedPreferences.getInstance();
_token = prefs.getString("token");
if (_token != "" && _token != null) {
print("alreay login.");
//your home page is loaded
}
else
{
//replace it with the login page
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => new LoginPage()),
);
}
}
Create a SplashPage
that you can pass as a home route in your MaterialApp()
Inside SplashPage, for example initState()
you can check for login and than push new route to a Navigator
.
SplashPage
can just be centered logo, with optional animation.
This is what i did,
void main() {
WidgetsFlutterBinding.ensureInitialized();
SharedPreferences.getInstance().then((instance) {
StorageService().sharedPreferencesInstance = instance; // Storage service is a service to manage all shared preferences stuff. I keep the instance there and access it whenever i wanted.
runApp(MyApp());
});
}
Then in the Material App Build
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'App Title',
home: _checkUserLoggedIn()
? HomeScreen()
: LoginPage(),
);
}
_checkUserLoggedIn Function
bool _checkUserLoggedIn() {
return _storageService.getFromShared('isLoggedIn'); // Just a get method from shared preferences
}
You need await checkIsLogin.
This is my code:
Future<Null> main() async {
SystemChrome.setPreferredOrientations([
DeviceOrientation.landscapeRight,
DeviceOrientation.landscapeLeft,
]);
Screen.keepOn(true);
SharedService.sharedPreferences = await SharedPreferences.getInstance();
account = SharedService.sharedPreferences.getString("Account");
password = SharedService.sharedPreferences.getString("Password");
runApp(new MyApp());
}