我想判断在主界面中启动哪个页面(实际上是登录页面和主页).所以我必须在首选项中阅读isLogin.主要怎么做?

我把这些代码Bundle 在一起:

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)

似乎主要有调用异步的问题,如何让它工作?

推荐答案

加载主页,如果用户未登录,则将其替换为登录页面()

@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()),
      );
    }
  }

Dart相关问答推荐

列表、捕获和...REST";元素的模式匹配

`异步内联方法`的这些定义之间有什么区别?

如何在 Dart 2.17+ 中处理future 的枚举值

当未指定返回类型时,dart 显示另一个函数内部的确切返回类型,但对于顶层函数显示为动态

dart 中的 Function() 和 Function 有什么区别?

带有字符串键的 Dart Map,与忽略大小写进行比较

PageView.builder 给出水平视口被给出无界高度错误

Swipe返回手势

如何限制TextSpan小部件的文本长度

为什么 Dart 内置的 List 接口可以实例化?

判断 Future 是否完整

Expansion Panel底部溢出

单击 TextField 小部件时 Flutter 小部件重建

Flutter-当文本字段有焦点时隐藏提示文本

如何在 Dart 中上传文件?

如何循环遍历元素列表

可选参数的默认值必须是常量

_internal 的语义是什么?

如何通过 Dart 中的值获取 Map 键?

如何在 Dart 中合并两个列表?