Flutter编辑器增强插件appflowy_editor_plugins的使用

发布于 1周前 作者 yuanlaile 来自 Flutter

Flutter编辑器增强插件appflowy_editor_plugins的使用

AppFlowy Editor Plugins 是为 AppFlowy Editor 提供的一系列插件。这些插件增强了编辑器的功能,使其更加灵活和强大。

插件列表

示例代码

以下是一个完整的示例,展示如何在Flutter应用中使用 appflowy_editor_plugins 来增强编辑器功能。

main.dart

import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:appflowy_editor/appflowy_editor.dart';
import 'package:appflowy_editor_plugins/appflowy_editor_plugins.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  VideoBlockKit.ensureInitialized();

  runApp(const AppWidget());
}

class AppWidget extends StatefulWidget {
  const AppWidget({Key? key}) : super(key: key);

  @override
  State<AppWidget> createState() => _AppWidgetState();
}

class _AppWidgetState extends State<AppWidget> {
  ThemeData theme = ThemeData.light();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Plugins',
      theme: theme,
      home: Editor(
        toggleBrightness: () => setState(() {
          theme = theme.brightness == Brightness.light
              ? ThemeData.dark()
              : ThemeData.light();
        }),
      ),
    );
  }
}

class Editor extends StatefulWidget {
  const Editor({Key? key, required this.toggleBrightness}) : super(key: key);

  final VoidCallback toggleBrightness;

  @override
  State<Editor> createState() => _EditorState();
}

class _EditorState extends State<Editor> {
  late final EditorState editorState;
  late final List<CharacterShortcutEvent>? shortcutEvents;
  late final List<CommandShortcutEvent>? commandEvents;
  late final Map<String, BlockComponentBuilder>? blockComponentBuilders;

  @override
  void initState() {
    super.initState();
    editorState = EditorState(
      document: Document.fromJson(jsonDecode(_initialDocumentData)),
    );

    shortcutEvents = [
      ...codeBlockCharacterEvents,
      ...standardCharacterShortcutEvents,
    ];

    commandEvents = [
      ...codeBlockCommands(),
      ...standardCommandShortcutEvents.where((event) => event != pasteCommand),
      linkPreviewCustomPasteCommand,
      convertUrlToLinkPreviewBlockCommand,
    ];

    blockComponentBuilders = {
      ...standardBlockComponentBuilderMap,
      CodeBlockKeys.type: CodeBlockComponentBuilder(
        configuration: BlockComponentConfiguration(
          textStyle: (_) => const TextStyle(
            fontFamily: 'RobotoMono',
            fontSize: 14,
            height: 1.5,
          ),
        ),
        styleBuilder: () => CodeBlockStyle(
          backgroundColor: Theme.of(context).brightness == Brightness.light
              ? Colors.grey[200]!
              : Colors.grey[800]!,
          foregroundColor: Theme.of(context).brightness == Brightness.light
              ? Colors.blue
              : Colors.blue[800]!,
        ),
        actions: CodeBlockActions(
          onCopy: (code) => Clipboard.setData(ClipboardData(text: code)),
        ),
      ),
      LinkPreviewBlockKeys.type: LinkPreviewBlockComponentBuilder(
        showMenu: true,
        menuBuilder: (context, node, state) => Positioned(
          top: 8,
          right: 4,
          child: SizedBox(
            height: 32.0,
            child: InkWell(
              borderRadius: BorderRadius.circular(4.0),
              onTap: () => Clipboard.setData(ClipboardData(
                  text: node.attributes[LinkPreviewBlockKeys.url])),
              child: const Padding(
                padding: EdgeInsets.symmetric(horizontal: 8),
                child: Icon(Icons.copy, size: 18.0),
              ),
            ),
          ),
        ),
      ),
      VideoBlockKeys.type: VideoBlockComponentBuilder(
        showMenu: true,
        menuBuilder: (Node node, VideoBlockComponentState state) => Positioned(
          top: 0,
          right: 10,
          child: VideoBlockMenu(node: node, state: state),
        ),
      ),
    };
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Editor Plugins'),
        actions: [
          IconButton(
            onPressed: widget.toggleBrightness,
            icon: Icon(
              Theme.of(context).brightness == Brightness.light
                  ? Icons.dark_mode
                  : Icons.light_mode,
            ),
          ),
        ],
      ),
      body: AppFlowyEditor(
        editorState: editorState,
        editorStyle: PlatformExtension.isMobile
            ? const EditorStyle.mobile()
            : const EditorStyle.desktop(),
        characterShortcutEvents: shortcutEvents,
        commandShortcutEvents: commandEvents,
        blockComponentBuilders: blockComponentBuilders,
      ),
    );
  }
}

const _initialDocumentData = """{
  "document": {
    "type": "page",
    "children": [
      {
        "type": "paragraph",
        "data": {"delta": []}
      },
      {
        "type": "video",
        "data": {
          "url": "https://ia600507.us.archive.org/13/items/09--0125--cars2-Trailer/Tumbacof-Cars2Trailer894_512kb.mp4",
          "width": 320.0
        }
      },
      {
        "type": "code",
        "data": {"delta": []}
      },
      {
        "type": "paragraph",
        "data": {"delta": []}
      }
    ]
  }
}""";

说明

  1. 初始化:确保在应用启动时调用 WidgetsFlutterBinding.ensureInitialized()VideoBlockKit.ensureInitialized()
  2. 主题切换:通过 toggleBrightness 方法实现主题切换。
  3. 编辑器状态editorState 初始化时从 JSON 数据创建文档。
  4. 快捷键事件:定义了字符快捷键和命令快捷键事件。
  5. 块组件构建器:配置了代码块、链接预览块和视频块的构建器。
  6. 初始文档数据:包含一个段落、一个视频块、一个代码块和另一个段落。

通过上述步骤,您可以轻松地在Flutter应用中集成和使用 appflowy_editor_plugins 插件,从而增强您的文本编辑器功能。


更多关于Flutter编辑器增强插件appflowy_editor_plugins的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter编辑器增强插件appflowy_editor_plugins的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,关于如何在Flutter项目中集成和使用appflowy_editor_plugins插件来增强编辑器功能,以下是一个基本的代码示例。这个示例展示了如何设置Flutter项目,并集成appflowy_editor_plugins插件来实现一些增强功能。

1. 设置Flutter项目

首先,确保你已经创建了一个Flutter项目。如果还没有,可以使用以下命令创建:

flutter create my_editor_app
cd my_editor_app

2. 添加依赖

pubspec.yaml文件中添加appflowy_editor_plugins依赖:

dependencies:
  flutter:
    sdk: flutter
  appflowy_editor_plugins: ^latest_version  # 请替换为最新版本号

然后运行flutter pub get来获取依赖。

3. 使用appflowy_editor_plugins

在你的主文件(通常是lib/main.dart)中,你可以按照以下方式使用appflowy_editor_plugins

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Editor Enhancement',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final _controller = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Editor Enhancement'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Expanded(
              child: AppFlowyEditor(
                controller: _controller,
                plugins: [
                  // 示例插件:代码块插件
                  CodeBlockPlugin(),
                  // 你可以添加更多插件,如表格、图片等
                  // TablePlugin(),
                  // ImagePlugin(),
                ],
              ),
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: () {
                // 获取编辑器内容
                print(_controller.text);
              },
              child: Text('Get Editor Content'),
            ),
          ],
        ),
      ),
    );
  }

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

4. 插件配置(可选)

某些插件可能需要额外的配置。例如,如果你使用的是CodeBlockPlugin,并且想要自定义代码高亮,你可能需要引入一个代码高亮库,如highlightrflutter_highlight,并在插件初始化时传递配置。

注意事项

  • 确保你遵循appflowy_editor_plugins的文档和示例,因为插件的具体使用方法和可用配置可能会随着版本更新而变化。
  • 如果你需要实现更复杂的编辑器功能,如实时协作、版本控制等,可能需要进一步集成其他服务或库。

这个示例提供了一个基本的框架,展示了如何在Flutter应用中使用appflowy_editor_plugins来增强编辑器功能。根据你的具体需求,你可以进一步定制和扩展这个示例。

回到顶部