【问题标题】:How to use Future<bool> in if statement condition?如何在 if 语句条件中使用 Future<bool>?
【发布时间】:2020-01-27 08:43:41
【问题描述】:

在 Flutter 中,我正在使用“url_launcher”包,该包使用Future&lt;bool&gt; 来检查应用程序是否可以启动其他应用程序。在我的代码中,我列出了电话号码,并且我只想为 WhatsApp 放置一个图标,前提是它安装在用户的设备上。

bool hasWhatsApp() {
    var whatsExists;
    canLaunch('https://api.whatsapp.com/').then((val) => whatsExists = val);
    return whatsExists;
  }

我正在使用此函数检查 if 语句内部是否在屏幕上显示图标,但是,它一直返回“null”。

if (phoneNumber.substring(0, 1) != '2' && hasWhatsApp())
                    IconButton(
                      icon: Image.asset('assets/icons/whatsapp.png'),
                      iconSize: Theme.of(context).iconTheme.size,
                      onPressed: () async {
                          await launch(whatsUrl);
                      },
                    ),

请问我该如何解决?

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    你试图做的事情行不通。

    你的函数hasWhatsApp 是同步的,所以当你调用它时它立即返回一个值。 在该函数内部,您启动了一个异步计算,当计算完成时(稍后),它会覆盖一个局部变量。到时候函数早就返回了。

    您无法立即返回一个直到稍后才可用的值。它根本不存在。

    因此,您需要等待未来,以便您可以延迟做出决定,直到价值可用。 例如,将您的 if 更改为:

    if (phoneNumber.substring(0, 1) != '2' && 
        await canLaunch('https://api.whatsapp.com/')) {
      ...
    }
    

    这确实意味着您必须使包含该if 的函数异步。 我不是 Flutter 专家,我猜你可能需要使用 FutureBuilder

    没有解决异步的方法。

    【讨论】:

    • 你是对的,它无法完成,我不能在 if 条件中使用 await 因为它不是纯布尔值,我必须以不同的方式处理它。谢谢@Irn
    【解决方案2】:

    您可以等待canLaunch 方法并将您的函数转换为async。由于您将函数设为async,因此您的返回类型需要为Future 试试这个:

    Future<bool> hasWhatsapp() async {
        return await canLaunch('https://api.whatsapp.com/');
    }
    

    如果您使用https://api.whatsapp.com/ 作为 url,它将始终返回 true,因为它可以通过浏览器启动它。如果您想检查是否安装了应用程序,我想您需要使用 canLaunch('whatsapp://') 代替。查看https://stackoverflow.com/a/50672986/12709039这个答案了解更多

    【讨论】:

    • 谢谢@Selim,这个解决方案我已经尝试过了,它让我回到零点,我不能在 if 语句中使用Future&lt;bool&gt;
    • 好吧,你可以在你的 if 语句之前声明一个变量,然后 var hasWhats = await hasWhatsapp(); 然后在你的 if 语句中使用它。
    • 如果你放 await 关键字,你也可以在 if 语句中使用Future&lt;bool&gt;
    • 这是一个无状态小部件,我不能将变量与 await 一起使用,它需要我将 Widget build 方法转换为 Future 所以它必须是 Widget build 之外的函数方法@Selim
    • 我希望能够在 if 语句的条件部分调用它,而不是在它里面! @Selim
    猜你喜欢
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 2015-09-06
    • 2016-02-28
    • 2021-08-03
    • 2016-05-28
    • 2018-06-18
    • 1970-01-01
    相关资源
    最近更新 更多