问题
I want to judge which page to start up in main (actually is login page and the home page). So I have to read isLogin in preferences. How to do that in main?
I tied these codes:
Future<Null> checkIsLogin() async {
String _token = "";
// If token exist already, then HomePage
SharedPreferences prefs = await SharedPreferences.getInstance();
_token = prefs.getString("token");
print('get token from prefs: ' + _token);
if (_token != "" && _token != null) {
// already login
print("alreay login.");
isLogin = true;
}
}
void main() {
App.init();
// if we have token then go to HomePage directly otherwise go to LoginPage.
Widget _defaultHome = new LoginPage();
checkIsLogin();
if (isLogin) {
_defaultHome = new HomePage();
}
runApp(new MaterialApp(
debugShowCheckedModeBanner: false,
theme: globalThemeData,
home: _defaultHome
));
}
above code, isLogin is an global variable. There was an error:
Performing full restart...
Restarted app in 2,810ms.
[VERBOSE-2:dart_error.cc(16)] Unhandled exception:
Invalid argument(s)
#0 _StringBase.+ (dart:core/runtime/libstring_patch.dart:245:57)
#1 checkIsLogin (file:///Volumes/xs/awesome/uranus/clients/flutter/flutter_asgard/lib/main.dart:17:34)
<asynchronous suspension>
#2 main (file:///Volumes/xs/awesome/uranus/clients/flutter/flutter_asgard/lib/main.dart:29:3)
#3 _startIsolate.<anonymous closure> (dart:isolate/runtime/libisolate_patch.dart:279:19)
#4 _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:165:12)
Seems there are issue to call async in main, how to get it to work?
回答1:
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()),
);
}
}
回答2:
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());
}
回答3:
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
}
回答4:
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.
来源:https://stackoverflow.com/questions/50458526/flutter-read-shared-preferences-in-main-then-decide-which-startup-page