Je veux juger quelle page démarrer en principal (en fait, c'est la page de connexion et la page d'accueil). Je dois donc lire isLogin dans les préférences. Comment faire ça en général?
J'ai lié ces 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
));
}
ci-dessus, isLogin est une variable globale. Il y avait une erreur:
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)
Il semble qu'il y ait un problème pour appeler async en principal, comment le faire fonctionner?
Chargez la page d'accueil et si l'utilisateur n'est pas connecté, puis remplacez-le par votre 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()),
);
}
}
Vous devez attendre checkIsLogin.
Voici mon 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());
}
Créez un SplashPage
que vous pouvez passer comme itinéraire de départ dans votre MaterialApp()
Dans SplashPage, par exemple initState()
, vous pouvez vérifier la connexion et pousser la nouvelle route vers un Navigator
.
SplashPage
peut simplement être un logo centré, avec une animation optionnelle.