android - 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。
我不明白这个消息。我非常感谢任何能够告诉我如何/是否可以修复它的人。
解决方案
这是我发现的:据我所知,Flutter 官方网页视图是一个被忽视的继子。有一些可追溯到三年前的错误很少受到关注。它的一些“功能”,例如longPress
抑制/检测,简直是荒谬可笑。
我改用Flutter Webview 插件,它解决了我遇到的大部分问题。只要记住启用withzoom:true
. 我发现webview不会自动捕获onPause
和onResume
事件。我处理如下
@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
推荐阅读
- tcp - Spring Integration TCP不发送消息
- apache-spark - 如何通过列名的前缀对火花数据框进行子集化?
- pandas - 在 azure ML 中过滤 TabularDataset
- javascript - 使用 php/js 将生成的数据导出到 excel
- python - 如何安装 pyinstaller (windows)
- regex - 正则表达式验证电子邮件格式或一些模板字符串
- java - 来自arraylist Java的对齐输出
- r - R:每一步计算利息和余额
- amazon-web-services - 在 IAM 策略资源中使用标签
- excel - 如何从 Excel 宏访问 Outlook 文件夹