You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter WebView加载文件遇URL超限报错,求解决方法

解决Flutter WebView加载本地文件时URL过长的问题

这个警告的核心原因是你把本地HTML、JS、CSS的内容直接拼接成data: URI来加载,而WebView对data URI的长度有2MB(2097152字节)的限制,和minSDK版本无关。以下是几种可行的解决办法:

  • 用本地服务器加载文件
    启动一个本地HTTP服务器,把本地文件作为静态资源提供,让WebView加载服务器的URL,彻底避开URI长度限制。可以用Flutter自带的HttpServer实现,示例代码:

    import 'dart:io';
    import 'package:flutter/material.dart';
    import 'package:webview_flutter/webview_flutter.dart';
    
    class LocalWebView extends StatefulWidget {
      @override
      _LocalWebViewState createState() => _LocalWebViewState();
    }
    
    class _LocalWebViewState extends State<LocalWebView> {
      late HttpServer server;
      late WebViewController controller;
    
      @override
      void initState() {
        super.initState();
        _startServer();
      }
    
      void _startServer() async {
        server = await HttpServer.bind(InternetAddress.loopbackIPv4, 8080);
        server.listen((request) async {
          String path = request.uri.path;
          if (path == '/') path = '/index.html';
          final file = File('${Directory.current.path}/web$path');
          if (await file.exists()) {
            final contentType = lookupMimeType(file.path);
            request.response
              ..headers.contentType = ContentType.parse(contentType!)
              ..addStream(file.openRead())
              ..close();
          } else {
            request.response.statusCode = HttpStatus.notFound;
            request.response.close();
          }
        });
    
        controller = WebViewController()
          ..setJavaScriptMode(JavaScriptMode.unrestricted)
          ..loadRequest(Uri.parse('http://localhost:8080'));
        setState(() {});
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: controller != null ? WebViewWidget(controller: controller) : SizedBox(),
        );
      }
    
      @override
      void dispose() {
        server.close();
        super.dispose();
      }
    }
    
  • 优化文件大小
    压缩你的HTML、JS、CSS文件,把总大小降到2MB以内:

    • 用工具压缩JS(比如Terser)和CSS(比如CleanCSS)
    • 移除HTML里的冗余空白、注释
    • 把大图片换成WebP格式,或者改成外部链接加载
  • 直接加载本地文件路径
    如果用的是webview_flutter插件,直接用loadFile方法加载本地文件的绝对路径,不需要转成data URI:

    final controller = WebViewController()
      ..setJavaScriptMode(JavaScriptMode.unrestricted)
      ..loadFile('${Directory.current.path}/web/index.html');
    
    WebViewWidget(controller: controller);
    

内容的提问来源于stack exchange,提问作者Rio Febri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 20:55:20