尝试通过回调启动外部URL,该回调传递给Flutter中的自定义小部件

时间:2019-11-30 17:16:38

标签: flutter dart

我有一个用于网站按钮的小部件。

class WebsiteButton extends StatelessWidget {
  final String url;
  final Future<void> launchCallback;

  WebsiteButton(this.url, this.launchCallback);

  @override
  Widget build(BuildContext context) {
    if (url != null && url.isNotEmpty) {
      return IconButton(
        icon: Icon(FontAwesomeIcons.globe),
        tooltip: url,
        onPressed: () => launchCallback,
      );
    } else {
      return IconButton(
        icon: Icon(FontAwesomeIcons.globe),
        onPressed: null,
      );
    }
  }
}

为使其更具可重用性(例如,如果我想设置在Webview中而不是浏览器中启动url的其他逻辑),我试图将回调_launch传递到小部件中,如下所示:

    Future<void> _launch(String url) async {
      if (await canLaunch(url)) {
        await launch(
          url,
          forceSafariVC: false,
          forceWebView: false,
        );
      } else {
        throw 'Could not launch $url';
      }
    }
    ...
    WebsiteButton(
      profile.website,
      _launch(profile.website)
    ),

这会导致奇怪的行为:URL会在包含小部件的页面构建后立即启动,而不是像我期望的那样单击IconButton。我想念什么?

(Flutter主控v1.12.16-pre.35,url_launcher:5.2.7)

1 个答案:

答案 0 :(得分:1)

看起来像您传递给窗口小部件的方法一样,因为您在传递参数时正在调用它。如果进行更改,则另一条注释会建议您使用其他功能,并且还使用匿名函数,该函数调用_launch方法,并以url字符串作为窗口小部件的参数。

所以,它看起来像这样:

WebsiteButton(
    profile.website,
    () => _launch(profile.website)
)

或者您可以将url和_launch方法传递给WebsiteButton,然后在WebsiteButton中使用该URL调用_launch。