【问题标题】:_launchURL gets launched when my widget gets build_launchURL 在我的小部件构建时启动
【发布时间】:2019-06-28 11:57:08
【问题描述】:

我正在使用 url_launcher 包在我的应用中启动 url。

我有许多链接需要使用单独的按钮来启动。

但是,当我加载我的无状态小部件时,它会启动“_launchURL”功能并立即打开https://www.yahoo.com

我相信这与创建时调用的小部件有关。但是“onPressed”中的函数不应该在实际按下之前调用,对吧?

class myStateless extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ListView(
        children: <Widget>[
            button("Link 1", "https://www.yahoo.com"),
            button("Link 2", "https://www.google.com"),
        ]
    );
  }
}

Widget button(String text, String url) {
    return RaisedButton(
        child: Text(text),
        onPressed: _launchURL(url),
      );
}

_launchURL(url) async {
  if (await canLaunch(url)) {
    await launch(url);
  } else {
    throw 'Could not launch $url';
  }
}

然后我得到错误: type 'Future&lt;dynamic&gt;' is not a subtype of type 'String'

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    好的,您只需更改您的 button() 创建方法,例如,

    onPressed: _launchURL(url)onPressed: () =&gt; _launchURL(url),

    就是这样。

    【讨论】:

    • 出于兴趣,你知道为什么会这样吗?我意识到后者是onPressed的回调,但是为什么前者默认调用该函数呢?
    • 我认为如果方法有参数并且如果您直接设置“onPressed”,那么您必须需要调用作为我的答案,但如果您的方法没有任何参数,那么您可以直接写为onPressed: _launchURL。按下按钮后会调用。
    【解决方案2】:

    _launchURL_launchURL(url) 之间存在巨大差异。

    如果您在按钮单击事件中设置_launchURL(url) 而没有按下按钮方法,则您正在调用方法,并且如果您传递_launchURL,它只会传递将在调用按钮时执行的方法实例。

    【讨论】:

      猜你喜欢
      • 2014-08-07
      • 2017-10-19
      • 2020-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-14
      • 1970-01-01
      • 2011-10-02
      相关资源
      最近更新 更多