首页 > 解决方案 > Flutter Webview - 在 Android 上捕获 touchstart 事件

问题描述

发布在 Github 上的这个问题似乎暗示touch events在 Android 实现中故意抑制它,表面上是为了启用检测以实现longpresses复制/粘贴的目的。

我自己的应用程序绝对需要能够捕获触摸事件 - 长按文本选择没有任何相关性。我想我会通过使用 Flutter webview 实现代码的本地副本来做到这一点,然后抑制longpress过滤器。webview_android.dart读取中的相关代码

我们通过拦截长按事件来防止文本选择。由于 Android 上的文本选择问题,这是一个临时的权宜之计: https ://github.com/flutter/flutter/issues/24585 - 文本选择对话框没有响应触摸事件。 https://github.com/flutter/flutter/issues/24584 - 文本选择句柄未显示。TODO(amirh):当上述问题得到解决时,将其删除。长按:(){},

为此,我下载了 Flutter 源代码,并确保它webview_flutter在一个文件夹中可用,该文件夹的名称比我的 Flutter 项目根文件夹低两级。修改pubspec.yaml后阅读

  webview_flutter:
    path: ../../webview_flutter

flutter clean && flutter run并在我的测试设备上构建并安装了运行APK。不过随后报道

设置 FlutterEngine。D/FlutterActivityAndFragmentDelegate(24999):没有提供首选的 FlutterEngine。为这个 FlutterFragment 创建一个新的 FlutterEngine。W/FlutterEngine(24999):尝试使用 FlutterEngine (io.flutter.embedding.engine.FlutterEngine@9480b1a) 自动注册插件,但找不到并调用 GeneratedPluginRegistrant。

我不明白这个消息。我非常感谢任何能够告诉我如何/是否可以修复它的人。

标签: androidflutterwebviewlong-presstouchstart

解决方案


这是我发现的:据我所知,Flutter 官方网页视图是一个被忽视的继子。有一些可追溯到三年前的错误很少受到关注。它的一些“功能”,例如longPress抑制/检测,简直是荒谬可笑。

我改用Flutter Webview 插件,它解决了我遇到的大部分问题。只要记住启用withzoom:true. 我发现webview不会自动捕获onPauseonResume事件。我处理如下

 @override void didChangeAppLifecycleState(AppLifecycleState state) 
 {
  setState(() 
  {
   appState = state;
   switch(state)
   {
    case AppLifecycleState.inactive:
    case AppLifecycleState.paused:
         FlutterWebviewPlugin.evalJavascript('callBack()');break;//onPause
    case AppLifecycleState.resumed:
         FlutterWebviewPlugin.evalJavascript('callBack()');break;//onResume 
   }
  });
 }

您必须确保

  • 你有一个适当初始化的FlutterWebviewPlugin单例实例
  • 在您的 Javascript 中,您已定义callBack

我应该提一下,我从上面开始,WidgetsApp上面的代码在它使用的有状态类中with WidgetsBindingObserver


推荐阅读