来自 HTMLString 的 Flutter android Webview 保持空白,直到交互然后显示内容

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

我遇到的问题是,android 中的 webview 保持空白(黑色或白色,具体取决于 android 主题),直到进行一些交互,无论是触摸屏幕、旋转设备还是使用音量按钮。 要重现可以创建示例 flutter,应用程序添加 webview_flutter(版本 4.9.0), 复制 WebViewComponent 并通过单击某个按钮打开它。

新页面将打开,但当您触摸屏幕时为空白,它将显示 HTML 内容。 在真实设备 android 14 上测试。

Navigator.push(
          context,
          MaterialPageRoute(
              builder: (context) => const WebViewPage(
                    content: "Some HTML Body",
                    title: "Cool Title",
                  )),
        );
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';

class WebViewPage extends StatefulWidget {
  const WebViewPage({super.key, required this.content, this.title});
  final String content;
  final String? title;

  @override
  State<WebViewPage> createState() => _WebViewPageState();
}

class _WebViewPageState extends State<WebViewPage> {
  var webViewController = WebViewController()..setJavaScriptMode(JavaScriptMode.unrestricted);
  @override
  void initState() {
    super.initState();
    // this also does not work
    //webViewController.loadRequest(Uri.dataFromString("your html", mimeType: 'text/html', encoding: utf8));
    webViewController..loadHtmlString('''<!DOCTYPE html>
        <html lang='de-DE'>
          <head>
            <meta charset="utf-8" />
            <meta name="viewport" content="width=device-width, initial-scale=0.2" />
            <style>
               div span, div p {
                  font-size: 2vw !important;
               }
            </style>
          </head>
          <body style="overflow-wrap: break-word; word-wrap: break-word; white-space: normal;">
            ${widget.content}
            <script>
              console.log("js log")
            </script>
          </body>
        </html>''')..platform.setOnConsoleMessage(onconsoleleLog);
  }

  @override
  Widget build(BuildContext context){
    return Scaffold(
        appBar: AppBar(
            title: Text(
          (widget.title != null ? widget.title! : 'Inhalt'),
          maxLines: 1,
        )),
        body: WebViewWidget(
          controller: webViewController,
        ));
  }


  void onconsoleleLog(JavaScriptConsoleMessage consoleMessage) {
    print("BROWSER LOG: ${consoleMessage.message}");  
  }
}

亲切的问候

android flutter android-webview flutterwebviewplugin webview-flutter
1个回答
0
投票

我发现了一些有用的东西。好像和渲染有关系。 将

displayWithHybridComposition
设置为 true 对我来说没有这个问题。 仍然不知道为什么默认不起作用。

    PlatformWebViewWidgetCreationParams params;

    if (WebViewPlatform.instance is AndroidWebViewPlatform) {

      params = AndroidWebViewWidgetCreationParams(

          controller: webViewController.platform,

          displayWithHybridComposition: true);

    } else {

      params = PlatformWebViewWidgetCreationParams(

          controller: webViewController.platform);

    }


    var webViewWidget =

        WebViewWidget.fromPlatformCreationParams(params: params);

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