Flutter中的异步函数不返回null

Posted

技术标签:

【中文标题】Flutter中的异步函数不返回null【英文标题】:Async function in flutter does not return null 【发布时间】:2020-04-17 11:08:26 【问题描述】:

我正在尝试检查用户的登录。但是,即使在返回 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;
      
    

【问题讨论】:

【参考方案1】:

我刚刚使用了一个未来构建器,它通过 AsyncSnapshot 管理从未来返回的数据。

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;

      
    

【讨论】:

查看我的更新,它可能有语法错误我刚刚在这里写下来 报错,build函数返回null。 我注意到它刚才直接从构建返回,在这种情况下你将不得不使用 FutureBuilder。我现在就写代码 还有其他方法不从构建中返回吗? 您可以使用 IndexedStack,它只显示一页并包含多个页面作为堆栈,如果您更改索引,则更改页面。然后直到你的数据加载显示任何你想要的居中加载屏幕,然后当数据完成加载时你改变状态并且堆栈的索引将返回到你想要的页面,现在这个问题是构建需要显示一些东西直到它等待让未来回归。【参考方案2】:

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

所以,这里有一个更好更正确的实现。 ``

class HomePage extends StatefulWidget 
  @override
  _HomePageState createState() => _HomePageState();


class _HomePageState extends State<HomePage> 
  bool isLogin = false;

  @override
  void initState() 
    checkLogin();
    super.initState();
  

  checkLogin() async 
    var prefs = await SharedPreferences.getInstance();
    var key = 'Token';
    var value = prefs.getString(key) ?? false;
    setState(() isLogin = value;);
  

  @override
  Widget build(BuildContext context) 
    return isLogin ? Login() : Dashboard();
  

``

【讨论】:

更新了答案。立即检查。

以上是关于Flutter中的异步函数不返回null的主要内容,如果未能解决你的问题,请参考以下文章

异步等待不等待完成

flutter 同时执行多个异步请求回调

在 null Flutter 上调用了 getter 'length'

Flutter进阶篇(4)-- Flutter的Future异步详解

FlutterFuture 与 FutureBuilder 异步编程代码示例 ( FutureBuilder 构造函数设置 | 处理 Flutter 中文乱码 | 完整代码示例 )

Flutter——dart 异步