web-dev-qa-db-ja.com

Flutterはメインで共有設定を読み取り、次にどの起動ページを決定しますか?

メインで起動するページ(実際はログインページとホームページ)を判断したい。だから私は設定でisLoginを読む必要があります。メインでそれを行う方法?

私はこれらのコードを結びました:

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
  ));
}

上記のコードでは、isLoginはグローバル変数です。エラーが発生しました:

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)

Mainでasyncを呼び出すのに問題があるようです、それを機能させる方法は?

9
Nicholas Jela

ホームページをロードし、ユーザーがログインしていない場合は、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

CheckIsLoginを待つ必要があります。

これは私のコードです:

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
蔡旻袁

MaterialApp()でホームルートとして渡すことができるSplashPageを作成します

SplashPage内で、たとえばinitState()を使用すると、ログインを確認してから、新しいルートをNavigatorにプッシュできます。

SplashPageは、オプションのアニメーションを使用して、ロゴを中央に配置することができます。

0
Tree