メインで起動するページ(実際はログインページとホームページ)を判断したい。だから私は設定で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を呼び出すのに問題があるようです、それを機能させる方法は?
ホームページをロードし、ユーザーがログインしていない場合は、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()),
);
}
}
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());
}
MaterialApp()
でホームルートとして渡すことができるSplashPage
を作成します
SplashPage内で、たとえばinitState()
を使用すると、ログインを確認してから、新しいルートをNavigator
にプッシュできます。
SplashPage
は、オプションのアニメーションを使用して、ロゴを中央に配置することができます。