web-dev-qa-db-fra.com

Flutter lit les préférences partagées dans le principal puis décide quelle page de démarrage?

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?

9
Nicholas Jela

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

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());
}
1
蔡旻袁

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.

0
Tree