Flutter 如何将触摸事件通过一个平台视图传递到另一个平台视图

jam*_*ame 2 dart flutter

我有一个具有两个平台视图的应用程序,其中一个是涂鸦视图,另一个是网络视图,下面是我的代码

\n\n
Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: Text('test'),\n      ),\n      body: BlocProvider<CourseDocBloc>(\n        create: (context) => CourseDocBloc(),\n        child: Container(\n          height: double.infinity,\n          child: Stack(\n            children: <Widget>[\n              Listener(\n                child: WebView(\n                  initialUrl: 'https://google.com',\n                  javascriptMode: JavascriptMode.unrestricted,\n                  onPageStarted: (url) {\n                    print('start load');\n                  },\n                  onPageFinished: (url) {\n                    print('load finished');\n                  },\n                ),\n               onPointerDown: (e) => {print('web down')},\n               onPointerUp: (e) => {print('web up')},\n              ),\n              UiKitView(\n                viewType: 'GLView',\n                hitTestBehavior: PlatformViewHitTestBehavior.transparent, \n                onPlatformViewCreated: (_) => created(),\n              )\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我设置UiKitView hitTestBehavior: PlatformViewHitTestBehavior.transparent\xef\xbc\x8c 时,底部Listener会打印web down, web up ...,但WebView无法接收触摸事件,我无法输入并单击 html 中的按钮。这GLView只是一个渲染涂鸦的 OpenGL 视图。

\n\n
\n\n
flutter doctor\nDoctor summary (to see all details, run flutter doctor -v):\n[\xe2\x9c\x93] Flutter (Channel stable, v1.12.13+hotfix.5, on Mac OS X 10.14.6 18G2022, locale zh-Hans-CN)\n\n[!] Android toolchain - develop for Android devices (Android SDK version 28.0.3)\n    ! Some Android licenses not accepted.  To resolve this, run: flutter doctor --android-licenses\n[\xe2\x9c\x93] Xcode - develop for iOS and macOS (Xcode 11.2.1)\n[\xe2\x9c\x93] Android Studio (version 3.5)\n[!] IntelliJ IDEA Ultimate Edition (version 2019.1.2)\n    \xe2\x9c\x97 Flutter plugin not installed; this adds Flutter specific functionality.\n    \xe2\x9c\x97 Dart plugin not installed; this adds Dart specific functionality.\n[\xe2\x9c\x93] VS Code (version 1.40.2)\n[\xe2\x9c\x93] Connected device (1 available)\n\n! Doctor found issues in 2 categories.\n
Run Code Online (Sandbox Code Playgroud)\n

Pav*_*van 6

看看这个 /sf/answers/3880196631/

使用 IgnorePointer 包装小部件会使该小部件的所有触摸事件传递到下面的小部件。

child: Stack(
            children: <Widget>[
              Listener(
                child: WebView(
                  initialUrl: 'https://google.com',
                  javascriptMode: JavascriptMode.unrestricted,
                  onPageStarted: (url) {
                    print('start load');
                  },
                  onPageFinished: (url) {
                    print('load finished');
                  },
                ),
               onPointerDown: (e) => {print('web down')},
               onPointerUp: (e) => {print('web up')},
              ),
              IgnorePointer(
                child: UiKitView(
                 viewType: 'GLView',
                 hitTestBehavior: PlatformViewHitTestBehavior.transparent, 
                 onPlatformViewCreated: (_) => created(),
               ),
             ),
            ],
          ),
Run Code Online (Sandbox Code Playgroud)