【发布时间】:2020-04-27 03:12:34
【问题描述】:
我正在尝试使用 Flutter Web 视图下载包含特定 url 模式的文件。这可行,但在这种情况下,浏览器打开两次,因为 navigationDelegate 被调用了两次。 NavigationRequest 对象除了 isForMainFrame 属性外是相同的。第一次是假的,第二次是真的。
CupertinoPageScaffold(
navigationBar: CupertinoNavigationBar(middle: Text(_appTitle)),
child: Container(
child: SafeArea(
child: IndexedStack(
index: _stackToView,
children: <Widget>[
WebView(
key: _key,
javascriptMode: JavascriptMode.unrestricted,
initialUrl: this._connectionString,
onPageStarted: (value) => setState(() {
if (shouldChangeStack) {
_stackToView = 1;
} else {
_stackToView = 0;
}
}),
onPageFinished: (value) => setState(() {
_stackToView = 0;
}),
navigationDelegate: (NavigationRequest request) async {
print(request.url);
if (request.url.contains("download")) {
setState(() {
shouldChangeStack = false;
});
if (await canLaunch(request.url)) {
await launch(request.url);
}
return NavigationDecision.prevent;
} else {
setState(() {
shouldChangeStack = true;
});
return NavigationDecision.navigate;
}
},
),
Container(
child: Center(
child: CircularProgressIndicator(),
),
)
],
),
top: true,
),
),
);
【问题讨论】:
-
我不明白问题是什么,是怎么不给代表打电话两次?
-
@LoVe 基本上我想用内置的 safari 下载文件,但是当我用 NavigationDelegate 截取 url 时,它会打开 safari 两次。虽然我希望它只打开一次。
-
您可以跟踪页面是否使用布尔值打开,在打开页面后将其设置为 true,并使用 if 语句包装您的委托方法以检查之前是否启动过页面,告诉我这是否适合你
-
是的,我试过了,这似乎是一种解决方法,想了解为什么它两次调用 Delegate 方法。如果有更清洁的方法