Flutter 颤振中的异步函数不返回null

Flutter 颤振中的异步函数不返回null,flutter,dart,Flutter,Dart,我正在尝试检查用户的登录名。但是,即使返回null,checklogin()在if条件下也不等于null class HomeScreen extends StatelessWidget { @override Widget build(BuildContext context) { if(checkLogin() == null) { return Login(); } else { return

我正在尝试检查用户的登录名。但是,即使返回null,checklogin()在if条件下也不等于null

class HomeScreen extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        if(checkLogin() == null) {
          return Login();
        } else {
          return Dashboard();
        }
      }
      Future<String> checkLogin() async {
        var prefs = await SharedPreferences.getInstance();
        var key = 'Token';
        var value = prefs.getString(key);
        print(value);  
        return value;
      }
    }
类主屏幕扩展小部件{
@凌驾
小部件构建(构建上下文){
if(checkLogin()==null){
返回登录名();
}否则{
返回仪表板();
}
}
Future checkLogin()异步{
var prefs=await SharedPreferences.getInstance();
var key='Token';
var value=prefs.getString(键);
印刷品(价值);
返回值;
}
}

我刚刚使用了一个future builder,它管理通过AsyncSnapshot从future返回的数据

class HomeScreen extends StatelessWidget {
      @override
      Widget build(BuildContext context) {

       return FutureBuilder(
        future: checkLogin(),
        builder: (BuildContext context, AsyncSnapshot snapshot){


        if (snapshot.hasData){
           var value = snapshot.data;
           if(value == null){
              return Login();
             }else{
              return Dashboard();
             }
        }else return Dashboard();
      }
    );
  }




      Future<String> checkLogin() async {
        var prefs = await SharedPreferences.getInstance();
        var key = 'Token';
        var value = prefs.getString(key);
        print(value);  
        return value;

      }
    }
类主屏幕扩展小部件{
@凌驾
小部件构建(构建上下文){
回归未来建设者(
future:checkLogin(),
生成器:(BuildContext上下文,异步快照){
if(snapshot.hasData){
var值=snapshot.data;
如果(值==null){
返回登录名();
}否则{
返回仪表板();
}
}else返回仪表板();
}
);
}
Future checkLogin()异步{
var prefs=await SharedPreferences.getInstance();
var key='Token';
var value=prefs.getString(键);
印刷品(价值);
返回值;
}
}

我刚刚使用了一个future builder,它管理通过AsyncSnapshot从future返回的数据

class HomeScreen extends StatelessWidget {
      @override
      Widget build(BuildContext context) {

       return FutureBuilder(
        future: checkLogin(),
        builder: (BuildContext context, AsyncSnapshot snapshot){


        if (snapshot.hasData){
           var value = snapshot.data;
           if(value == null){
              return Login();
             }else{
              return Dashboard();
             }
        }else return Dashboard();
      }
    );
  }




      Future<String> checkLogin() async {
        var prefs = await SharedPreferences.getInstance();
        var key = 'Token';
        var value = prefs.getString(key);
        print(value);  
        return value;

      }
    }
类主屏幕扩展小部件{
@凌驾
小部件构建(构建上下文){
回归未来建设者(
future:checkLogin(),
生成器:(BuildContext上下文,异步快照){
if(snapshot.hasData){
var值=snapshot.data;
如果(值==null){
返回登录名();
}否则{
返回仪表板();
}
}else返回仪表板();
}
);
}
Future checkLogin()异步{
var prefs=await SharedPreferences.getInstance();
var key='Token';
var value=prefs.getString(键);
印刷品(价值);
返回值;
}
}

问题是,
checkLogin
函数是异步的,并返回您将等待的未来,您将直接在构建中等待

因此,这里有一个更好、正确的实现。 ``

类主页扩展StatefulWidget{
@凌驾
_HomePageState createState()=>\u HomePageState();
}
类_HomePageState扩展状态{
bool-isLogin=false;
@凌驾
void initState(){
checkLogin();
super.initState();
}
checkLogin()异步{
var prefs=await SharedPreferences.getInstance();
var key='Token';
var值=prefs.getString(键)??错误;
setState((){isLogin=value;});
}
@凌驾
小部件构建(构建上下文){
返回isLogin?Login():Dashboard();
}
}

``

问题是,
checkLogin
函数是异步的,并返回将来,您需要等待,并直接在构建中等待

因此,这里有一个更好、正确的实现。 ``

类主页扩展StatefulWidget{
@凌驾
_HomePageState createState()=>\u HomePageState();
}
类_HomePageState扩展状态{
bool-isLogin=false;
@凌驾
void initState(){
checkLogin();
super.initState();
}
checkLogin()异步{
var prefs=await SharedPreferences.getInstance();
var key='Token';
var值=prefs.getString(键)??错误;
setState((){isLogin=value;});
}
@凌驾
小部件构建(构建上下文){
返回isLogin?Login():Dashboard();
}
}

``

查看我的更新,它可能有语法错误,我刚刚写在这里,它给出了一个错误,构建函数返回null。我注意到它刚刚从构建中直接返回,在这种情况下,您必须使用FutureBuilder。我现在就要写代码了。还有其他方法不能从构建中返回吗?你可以使用IndexedStack,它只显示一个页面,包含多个页面作为堆栈,如果你改变索引,你就改变页面。然后,直到您的数据加载显示任何您想要的内容,例如居中加载屏幕,然后当数据加载完成时,您更改状态,堆栈索引将返回到您想要的页面,现在这个问题是构建需要显示一些内容,直到它等待将来返回。查看我的更新,它可能有语法错误,我只是写在这里,它给出了一个错误,构建函数返回null。我注意到它刚刚从构建中直接返回,在这种情况下,您将不得不使用FutureBuilder。我现在就要写代码了。还有其他方法不能从构建中返回吗?你可以使用IndexedStack,它只显示一个页面,包含多个页面作为堆栈,如果你改变索引,你就改变页面。然后,直到您的数据加载显示任何您想要的内容,如居中加载屏幕,然后当数据加载完成时,您更改状态,堆栈的索引将返回到您想要的页面,现在这个问题是构建需要显示一些内容,直到它等待将来返回。更新了答案。现在检查。更新答案。现在检查一下。