草庐IT

flutter - 有没有办法向 webview_flutter 小部件添加下拉刷新?

coder 2023-07-21 原文

我正在尝试创建一个 flutter 应用程序,它将在 WebView 中显示一个网站,我希望能够设置一个 RefreshIndicator,当用户在 webview 上下拉并刷新 WebView 时触发。

我可以使 WebView 正常工作,但 RefreshIndicator 仅适用于可垂直滚动的 View 。我已尝试将 WebView 作为唯一的子项添加到 ListView,但 WebView 不会下拉 ListView。

我试过将 RefreshIndicator 放在 Webview 周围,我也试过使用 PageView 而不是 ListView

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/gestures.dart';
import 'package:webview_flutter/webview_flutter.dart';

class WebViewContainer extends StatefulWidget {
  final url;

  WebViewContainer(this.url);

  @override
  createState() => _WebViewContainerState(this.url);
}

class _WebViewContainerState extends State<WebViewContainer> {
  final Completer<WebViewController> _controller =
      Completer<WebViewController>();

  var _url;
  final _key = UniqueKey();

  _WebViewContainerState(this._url);

  // WebViewController _webViewController;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: RefreshIndicator(
        child: ListView(children: [
          Container(
            child: Center(child: Text('Top')),
          ),
          Container(
            height: MediaQuery.of(context).size.height,
            child: WebView(
              key: _key,
              initialUrl: _url,
              javascriptMode: JavascriptMode.unrestricted,
              onWebViewCreated: (WebViewController webViewController) {
                _controller.complete(webViewController);
              },
              navigationDelegate: (navigationRequest) {
                return NavigationDecision.navigate;
              },
              gestureRecognizers: Set()
                ..add(Factory<VerticalDragGestureRecognizer>(
                    () => VerticalDragGestureRecognizer())),
              javascriptChannels: <JavascriptChannel>[
                _toasterJavascriptChannel(context),
              ].toSet(),
              onPageFinished: (String url) {
                print('Page Finished loading: $url');
              },
            ),
          ),
          Container(
            child: Center(child: Text('Bottom')),
          ),
        ]),
        onRefresh: _refreshWebView,
      ),
    );
  }

我想要的是一种只显示 Webview 的方法,当他们下拉 Webview 时它会刷新。另一种选择是,如果您在 Webview 中滚动到页面顶部,Webview 是否会下拉 ListView。

最佳答案

嗯,这是可以做到的。

  1. 在创建 webView 时,将 gestureRecognizers 设置为 EagerGestureRecognizer();

  2. 实现一个扩展 VerticalDragGestureRecognizer 的 AllowMultipleGestureRecognizer,将 rejectGesture() 重写为 acceptGesture();

  3. 实现一个 RawGestureDetector,使用 AllowMultipleGestureRecognizer 作为“手势”;

  4. 在RawGestureDetector中放一个LayoutBuilder(),目的是获取子上下文;

  5. 将您的 webView 放入 LayoutBuilder。现在,webView 和 RawGestureDetector 都可以接收手势事件。

  6. 实现将手势转换为滚动通知的转换层。您可能感兴趣的滚动通知是:ScrollStartNotification、OverscrollNotification、ScrollUpdateNotification 和 ScrollEndNotification。 RefreshIndicator 不需要 UserScrollNotification。这一层可能需要一些时间才能把事情做好;

  7. 在RawGestureDetector 的回调函数:onStart()/onUpdte()/onEnd() 中,调用翻译层生成通知。然后使用您从 LayoutBuilder 获得的上下文来调用正在监听滚动事件的每个祖先小部件。使用 context.visitAncestorElements() 来实现这一点。

  8. 修改 webView 的平台代码(Android 和 iOS),以将监听器添加到 YOffset。监听器调用“ channel ”方法将偏移量传递给您的 flutter 代码。 6 中的转换层查看 YOffset 以生成正确的通知(例如 OverscrollNotification 或 ScrollUpdateNotification)。

  9. 将 RawGestureDetector 放入 RefreshIndicator 中,您就完成了!

结果: 结果相当令人失望。 RefreshIndicator 的动画会导致 webView 重绘几次,从而导致屏幕闪烁和相当大的延迟。这绝对不是一个好的用户体验。 Flutter 不能很好地处理重型“插件”小部件,应避免对 webView 进行任何与动画相关的操作(例如推送/弹出)。

浪费时间。

关于flutter - 有没有办法向 webview_flutter 小部件添加下拉刷新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57171434/

有关flutter - 有没有办法向 webview_flutter 小部件添加下拉刷新?的更多相关文章

  1. ruby - 难道Lua没有和Ruby的method_missing相媲美的东西吗? - 2

    我好像记得Lua有类似Ruby的method_missing的东西。还是我记错了? 最佳答案 表的metatable的__index和__newindex可以用于与Ruby的method_missing相同的效果。 关于ruby-难道Lua没有和Ruby的method_missing相媲美的东西吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7732154/

  2. ruby-on-rails - rails 目前在重启后没有安装 - 2

    我有一个奇怪的问题:我在rvm上安装了ruby​​onrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(

  3. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  4. 没有类的 Ruby 方法? - 2

    大家好!我想知道Ruby中未使用语法ClassName.method_name调用的方法是如何工作的。我头脑中的一些是puts、print、gets、chomp。可以在不使用点运算符的情况下调用这些方法。为什么是这样?他们来自哪里?我怎样才能看到这些方法的完整列表? 最佳答案 Kernel中的所有方法都可用于Object类的所有对象或从Object派生的任何类。您可以使用Kernel.instance_methods列出它们。 关于没有类的Ruby方法?,我们在StackOverflow

  5. ruby-on-rails - Rails 3,嵌套资源,没有路由匹配 [PUT] - 2

    我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle

  6. ruby-on-rails - 有没有办法为 CarrierWave/Fog 设置上传进度指示器? - 2

    我在Rails应用程序中使用CarrierWave/Fog将视频上传到AmazonS3。有没有办法判断上传的进度,让我可以显示上传进度如何? 最佳答案 CarrierWave和Fog本身没有这种功能;你需要一个前端uploader来显示进度。当我不得不解决这个问题时,我使用了jQueryfileupload因为我的堆栈中已经有jQuery。甚至还有apostonCarrierWaveintegration因此您只需按照那里的说明操作即可获得适用于您的应用的进度条。 关于ruby-on-r

  7. ruby - 没有类方法获取 Ruby 类名 - 2

    如何在Ruby中获取BasicObject实例的类名?例如,假设我有这个:classMyObjectSystem我怎样才能使这段代码成功?编辑:我发现Object的实例方法class被定义为returnrb_class_real(CLASS_OF(obj));。有什么方法可以从Ruby中使用它? 最佳答案 我花了一些时间研究irb并想出了这个:classBasicObjectdefclassklass=class这将为任何从BasicObject继承的对象提供一个#class您可以调用的方法。编辑评论中要求的进一步解释:假设你有对象

  8. ruby - 没有轨道的 ActiveRecord 时区 - 2

    我在非Rails项目中使用ActiveRecord。在Rails中,我可以这样做:config.time_zone='EasternTime(US&Canada)'config.active_record.default_timezone='EasternTime(US&Canada)'但如果我不使用rails,我该如何设置时区? 最佳答案 ActiveRecord::Base.default_timezone='EasternTime(US&Canada)' 关于ruby-没有轨道的A

  9. ruby-on-rails - 没有这样的文件或目录 - 用 Mini Magick 识别 - 2

    在我让另一个人重做我的前端UI之前,我的Rails应用程序运行平稳。我已经尝试解决此错误3天了。这是错误:Nosuchfileordirectory-identifyExtractedsource(aroundline#59):575859606162@post=Post.find(params[:id])authorize@postif@post.update_attributes(post_params)flash[:notice]="Postwasupdated."redirect_to[@topic,@post]else{"utf8"=>"✓","_method"=>"patc

  10. ruby-on-rails - 没有参数的 `<<`(小于两倍)是什么意思? - 2

    我在一个我想在formtasticGem中覆盖的方法中找到了这个。该方法如下所示:defto_htmlinput_wrappingdohidden_field_html是什么意思?在第三行做什么?我知道它对数组有什么作用,但在这里我不知道。 最佳答案 你可以这样读:hidden_field_htmllabel_with_nested_checkbox是连接到hidden_​​field_html末尾的参数-为了“清晰”,他们将其分成两行 关于ruby-on-rails-没有参数的`

随机推荐