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

Flutter Web中Widget转PNG下载出现网络错误问题求助

解决Flutter Web中Widget转图片下载后显示「网络错误」的问题

你遇到的「网络错误」是因为两个关键问题:

  • 直接把Uint8List拼进data URL,没有正确转成base64编码字符串
  • data URL的MIME类型用了application/octet-stream,浏览器无法正确识别为图片格式

修改后的代码

import 'dart:typed_data';
import 'dart:convert'; // 新增导入base64编码工具
import 'package:flutter/material.dart';
import 'package:widgets_to_image/widgets_to_image.dart';
import 'dart:html' as html;

void main() {
  runApp(const MyApp());
}

Color contrastColor = Colors.black;
Color mainColor = Colors.white;

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  WidgetsToImageController controller = WidgetsToImageController();
  Uint8List? bytes;

  Future<void> saveImg() async {
    final bytes = await controller.capture();
    if (bytes == null) return; // 增加空值判断,避免异常

    // 将Uint8List转换为base64字符串
    final base64Str = base64Encode(bytes);
    // 使用正确的图片MIME类型
    final anchor = html.AnchorElement(
      href: 'data:image/png;base64,$base64Str'
    )
      ..download = "image.png"
      ..target = 'blank';

    html.document.body!.append(anchor);
    anchor.click();
    anchor.remove();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Column(
        children: [
          Center(
            child: ElevatedButton(
              child: Text("TEST"),
              onPressed: () => saveImg(),
            ),
          ),
          WidgetsToImage(
            child: Text("HALLO WELT"),
            controller: controller,
          )
        ],
      ),
    );
  }
}

关键修改说明

  1. 导入base64编码工具:新增dart:convert包,用base64Encode()把Uint8List转换成浏览器可识别的base64字符串,避免直接拼接导致的编码错误。
  2. 修正MIME类型:将data URL的类型从application/octet-stream改为image/png,让浏览器明确这是PNG图片文件,能正确解析和显示。
  3. 增加空值判断:捕获到的bytes可能为空,提前判断避免后续操作抛出异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 17:40:33