Flutter webview 使其他小部件无法交互

问题描述 投票:0回答:1

使用 webview 时,如果堆栈列表视图中的添加 webview 不滚动,任何手势或鼠标事件都会被忽略,并且 webview 上的小部件将变得非交互式,就像我的示例中一样。

https://zapp.run/edit/flutter-zsm060nsn06?entry=lib/main.dart&file=lib/main.dart

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

void main(List<String> args) {
  return runApp(const App());
}

class App extends StatelessWidget {
  const App({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Stack(
          children: [
            webview(),
            ListView.builder(
              itemCount: 10,
              itemBuilder: (context, index) {
                return SizedBox(
                  height: 100,
                  child: Text('Item $index'),
                );
              },
            ),
          ],
        ),
      ),
    );
  }

  Widget webview() {
    final controller = WebViewController()..loadHtmlString('''
<!DOCTYPE html>
<html>
<body>
    <h1>Hello World</h1>
</body>
</html>
''');

    return WebViewWidget(
      controller: controller,
    );
  }
}

flutter dart webview
1个回答
0
投票

即使将 WebView 放置在 Flutter 应用程序中,当点击按钮或列表停止工作时也可能会遇到这样的问题。发生这种情况是因为 WebView 在占据整个屏幕区域的平台相关层中工作,从而阻止触摸事件击中可能位于 WebView 上方或下方的其他小部件。因此,当使用 ListView.builder 等组件时,当它们位于 WebView 的右侧或下方时,应用程序可能会冻结。

为了解决这个问题,通常的方法是控制 WebView 与其他小部件的通信方式。还有一种方法是 WebView 不应占据屏幕的整个大小,这反过来又导致无法访问位于其下方的其他小部件。这可以通过将 WebView 的大小设置为屏幕的一小部分,同时使其他小部件再次可点击来完成。

另一种可能性是将 WebView 封装在忽略指针小部件中,该小部件给出一个指针,指示何时应该接受或拒绝触摸输入。通过这样做,您应该能够为其他组件提供特殊处理,同时允许触摸事件在需要时向下冒泡到其他目标。

© www.soinside.com 2019 - 2024. All rights reserved.