【问题标题】:Pull to refresh WebView in flutter拉动刷新WebView
【发布时间】:2020-12-02 04:38:35
【问题描述】:

我构建了一个 WebView 应用,我想下拉屏幕刷新网页。我将flutter_inappwebview 用于网络视图。我尝试将 WebView 包装在 SingleChildScrollView 或 ListView 中,但它们都不起作用。在下面的代码中,当滑动功能起作用时,WebView 不可滚动。

我一直在寻找解决方案,但我找不到。任何帮助将不胜感激!

@override
Widget build(BuildContext context) {
return WillPopScope(
  onWillPop: () => _onBackPressed(),
  child: Scaffold(
    body: SafeArea(
      child: RefreshIndicator(
        onRefresh: () async {
          print("##Refresh");
          webview.reload();
        },
        child: SingleChildScrollView(
          physics: AlwaysScrollableScrollPhysics(),
          child: Container(
            height: MediaQuery.of(context).size.height,
            child: Center(
              child: Stack(
                children: <Widget>[
                  InAppWebView(
                    gestureRecognizers: Set()
                      ..add(
                        Factory<VerticalDragGestureRecognizer>(
                            () => VerticalDragGestureRecognizer(),
                        ),
                      ),
                    initialOptions: InAppWebViewGroupOptions(
                      crossPlatform: InAppWebViewOptions(
                        debuggingEnabled: true,
                        userAgent: 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Mobile Safari/537.36',
                      ),
                    ),
                    onWebViewCreated: (InAppWebViewController controller) {
                      webview = controller;
                      controller.loadUrl(url: startURL);
                    },
                    onLoadStart: (InAppWebViewController controller, String url) async {
                      print("##onloadstart: " + url);
                    },
                    onLoadStop: (InAppWebViewController controller, String url) async {
                      print("##onloadstop: $url");
                    },
                    onProgressChanged: (InAppWebViewController controller, int progress) {
                      setState(() {
                        this.progress = progress / 100;
                      });
                    }
                  ),
                  Align(
                    alignment: Alignment.center,
                    child: buildProgressBar(progress),
                  ),
                ],
              ),
            ),
          ),
        ),
      ),
    ),
  ),
);
}

【问题讨论】:

  • 抱歉,我不明白问题出在 web 视图中滚动。我复制了这个问题,然后,因为我有一个 tabview 控制器,所以我使用了gestureRecognizers: >[ new Factory( () => new EagerGestureRecognizer(), ), ].toSet()问题,如果不是这样,那么它是由于使用了扩展子级。
  • child: Scaffold(body: SafeArea(child: Column(children: [ Container( padding: E​​dgeInsets.all(3.0), child: Icon(Icons.keyboard_arrow_down), ), Expanded(孩子:容器(孩子:InAppWebView(

标签: flutter dart webview webview-flutter


【解决方案1】:

这可能是您的正确答案 ->

child:  Scaffold(
                  body: SafeArea(
                      child: Column(children: <Widget>[
                        Container(
                          padding: EdgeInsets.all(3.0),
                          child: Icon(Icons.keyboard_arrow_down),
                        ),
                        Expanded(
                          child: Container(
                            child: InAppWebView(...)

【讨论】:

  • 在这种情况下,如何获得触发拉动刷新动作?
  • void _onRefresh() async { if (webView != null) { webView.reload(); } 等待 Future.delayed(持续时间(毫秒:1000)); _refreshController.refreshCompleted(); }
  • 我对你的 cmets 感到困惑。在上面你使用 Tabview +gestureRecognizers。这个怎么样?你使用 RefreshIndicator 还是 pull_to_refresh 包?
  • 我正在使用 pull_to_refresh,并将他们的示例 listview.builder 替换为 inappwebview 脚手架。所以只需复制他们给你的例子,在这个答案上用这个脚手架替换列表视图。
  • 您的解决方案确实对我有帮助。但是如果我们想通过从 webview 中拉动来触发拉动刷新,这是行不通的。无论如何,非常感谢!
【解决方案2】:

如果您使用 pull_to_refresh 包,它实际上非常简单。您所要做的就是查看他们的演示代码的底部,并将 listview 构建器替换为您的 inappwebview 脚手架。

child: ListView.builder(), -> child:  Scaffold(),

别忘了添加你的 webView.reload();拉动。

包@https://pub.dev/packages/pull_to_refresh

#编辑 抱歉,我不明白问题出在 webview 中滚动。我复制了这个问题,然后,因为我有一个 tabview 控制器,所以我使用了

gestureRecognizers: <Factory<OneSequenceGestureRecognizer>>[
new Factory<OneSequenceGestureRecognizer>(
() => new EagerGestureRecognizer(),
),
].toSet(),

这解决了这个问题,如果不是这样,那么它是由于使用了扩展子级。

【讨论】:

  • child: Scaffold(body: SafeArea(child: Column(children: [ Container( padding: E​​dgeInsets.all(3.0), child: Icon(Icons.keyboard_arrow_down), ), Expanded(孩子:容器(孩子:InAppWebView(
  • 滚动视图可以工作,但在这种情况下拉动刷新不起作用。
  • void _onRefresh() async { if (webView != null) { webView.reload(); } 等待 Future.delayed(持续时间(毫秒:1000)); _refreshController.refreshCompleted(); }
猜你喜欢
  • 2021-09-04
  • 1970-01-01
  • 1970-01-01
  • 2019-12-30
  • 1970-01-01
  • 2021-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多