【问题标题】:Flutter webview navigationDelegate called twiceFlutter webview navigationDelegate 调用了两次
【发布时间】: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 方法。如果有更清洁的方法

标签: ios flutter


【解决方案1】:

之所以会调用两次委托方法,是因为调用了setState()。这会导致整个Widget build() 被重建。正如之前在 cmets 中提到的,解决此问题的方法是在启动页面之前设置检查器并定义是否需要打开页面。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-07
    • 2019-11-01
    • 1970-01-01
    • 2019-12-25
    • 2022-11-28
    • 1970-01-01
    • 2022-11-28
    • 2021-08-13
    相关资源
    最近更新 更多