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

Chrome Web环境下FlutterQuill工具栏插入图片(含URL)功能实现失败求助

解决FlutterQuill Web环境插入图片报错问题

核心问题

Chrome Web环境下,FlutterQuill默认未包含图片嵌入的Web专属Builder,必须手动配置对应组件才能支持图片(含URL)插入功能,否则会触发!kIsWeb. Please provide image EmbedBuilder for Web或Embeddable type 'image' is not supported by supplied embed builders错误。


具体修复步骤

1. 对齐依赖版本

确保pubspec.yaml中flutter_quill和flutter_quill_extensions的主版本一致,避免版本兼容问题:

dependencies:
  flutter:
    sdk: flutter
  flutter_quill: ^6.3.1
  flutter_quill_extensions: ^6.0.4

执行flutter pub get更新依赖。

2. 配置Web专属图片EmbedBuilder

在QuillEditor的embedBuilders中,除了通用的FlutterQuillEmbeds.builders(),必须针对Web环境添加QuillImageEmbedBuilderWeb:

QuillEditor(
  controller: _quillController,
  embedBuilders: [
    ...FlutterQuillEmbeds.builders(),
    if (kIsWeb) const QuillImageEmbedBuilderWeb(), // Web端专属配置
  ],
  // 其他编辑器配置(readOnly、padding等)
)

3. 配置工具栏的图片插入回调

为QuillToolbar启用图片按钮,并实现URL插入的逻辑:

QuillToolbar(
  controller: _quillController,
  embedButtons: FlutterQuillEmbeds.buttons(
    imageButtonOptions: QuillImageButtonOptions(
      // 处理URL插入请求
      onUrlInsertCallback: (url) async {
        if (url.trim().isEmpty) return false;
        final selection = _quillController.selection;
        // 将图片URL插入到编辑器光标位置
        _quillController.replaceText(
          selection.baseOffset,
          selection.extentOffset - selection.baseOffset,
          BlockEmbed.image(url),
          null,
        );
        return true;
      },
      // 若不需要本地图片上传,直接返回null即可
      onImagePickCallback: (file) async => null,
    ),
  ),
  // 其他工具栏配置(toolbarIconSize、color等)
)

完整可运行示例

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_quill/flutter_quill.dart';
import 'package:flutter_quill_extensions/flutter_quill_extensions.dart';

class QuillWebImageEditor extends StatefulWidget {
  const QuillWebImageEditor({super.key});

  @override
  State<QuillWebImageEditor> createState() => _QuillWebImageEditorState();
}

class _QuillWebImageEditorState extends State<QuillWebImageEditor> {
  late final QuillController _quillController;

  @override
  void initState() {
    super.initState();
    _quillController = QuillController.basic();
  }

  @override
  void dispose() {
    _quillController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Quill Web 图片编辑器')),
      body: Column(
        children: [
          // 编辑器工具栏
          QuillToolbar(
            controller: _quillController,
            embedButtons: FlutterQuillEmbeds.buttons(
              imageButtonOptions: QuillImageButtonOptions(
                onUrlInsertCallback: (url) async {
                  if (url.trim().isEmpty) return false;
                  final selection = _quillController.selection;
                  _quillController.replaceText(
                    selection.baseOffset,
                    selection.extentOffset - selection.baseOffset,
                    BlockEmbed.image(url),
                    null,
                  );
                  return true;
                },
                onImagePickCallback: (file) async => null,
              ),
            ),
          ),
          // 编辑器主体
          Expanded(
            child: QuillEditor(
              controller: _quillController,
              readOnly: false,
              autoFocus: false,
              embedBuilders: [
                ...FlutterQuillEmbeds.builders(),
                if (kIsWeb) const QuillImageEmbedBuilderWeb(),
              ],
              padding: const EdgeInsets.all(16),
              scrollable: true,
              focusNode: FocusNode(),
            ),
          ),
        ],
      ),
    );
  }
}

内容的提问来源于stack exchange,提问作者Minh Tiến Đào

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 21:30:47