我有一个用于网站按钮的小部件。
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)
答案 0 :(得分:1)
看起来像您传递给窗口小部件的方法一样,因为您在传递参数时正在调用它。如果进行更改,则另一条注释会建议您使用其他功能,并且还使用匿名函数,该函数调用_launch方法,并以url字符串作为窗口小部件的参数。
所以,它看起来像这样:
WebsiteButton(
profile.website,
() => _launch(profile.website)
)
或者您可以将url和_launch方法传递给WebsiteButton,然后在WebsiteButton中使用该URL调用_launch。