appflowy-editor/example/lib/pages/simple_editor.dart

127 lines
3.6 KiB
Dart
Raw Normal View History

import 'dart:convert';
2023-04-20 13:45:46 +08:00
import 'dart:io';
import 'package:appflowy_editor/appflowy_editor.dart';
import 'package:flutter/material.dart';
class SimpleEditor extends StatelessWidget {
const SimpleEditor({
super.key,
required this.jsonString,
required this.themeData,
required this.onEditorStateChange,
});
final Future<String> jsonString;
final ThemeData themeData;
final void Function(EditorState editorState) onEditorStateChange;
@override
Widget build(BuildContext context) {
return FutureBuilder<String>(
future: jsonString,
builder: (context, snapshot) {
if (snapshot.hasData &&
snapshot.connectionState == ConnectionState.done) {
final editorState = EditorState(
document: Document.fromJson(
Map<String, Object>.from(
json.decode(snapshot.data!),
),
),
);
editorState.logConfiguration
..handler = debugPrint
..level = LogLevel.all;
onEditorStateChange(editorState);
final scrollController = ScrollController();
2023-04-25 19:58:48 +08:00
if (PlatformExtension.isDesktopOrWeb) {
return FloatingToolbar(
editorState: editorState,
scrollController: scrollController,
child: _buildEditor(
context,
editorState,
scrollController,
),
);
2023-04-25 19:58:48 +08:00
} else {
return Column(
children: [
Expanded(
child: _buildEditor(context, editorState, scrollController),
),
2023-04-25 19:58:48 +08:00
if (Platform.isIOS || Platform.isAndroid)
_buildMobileToolbar(context, editorState),
],
);
}
} else {
return const Center(
child: CircularProgressIndicator(),
);
}
},
);
}
2023-04-20 13:45:46 +08:00
Widget _buildEditor(
BuildContext context,
EditorState editorState,
ScrollController? scrollController,
) {
2023-04-20 13:45:46 +08:00
return AppFlowyEditor(
editorState: editorState,
themeData: themeData,
autoFocus: editorState.document.isEmpty,
scrollController: scrollController,
// customBuilders: {
// 'paragraph': TextBlockComponentBuilder(),
// 'todo_list': TodoListBlockComponentBuilder(),
// 'bulleted_list': BulletedListBlockComponentBuilder(),
// 'numbered_list': NumberedListBlockComponentBuilder(),
// 'quote': QuoteBlockComponentBuilder(),
// },
blockComponentBuilders: {
2023-04-25 23:09:01 +08:00
'document': DocumentComponentBuilder(),
2023-04-20 13:45:46 +08:00
'paragraph': TextBlockComponentBuilder(),
'todo_list': TodoListBlockComponentBuilder(),
'bulleted_list': BulletedListBlockComponentBuilder(),
'numbered_list': NumberedListBlockComponentBuilder(),
'quote': QuoteBlockComponentBuilder(),
},
2023-04-23 21:26:05 +08:00
characterShortcutEvents: [
2023-04-24 20:05:02 +08:00
// '\n'
2023-04-23 21:26:05 +08:00
insertNewLine,
// bulleted list
formatAsteriskToBulletedList,
formatMinusToBulletedList,
2023-04-23 22:50:14 +08:00
// numbered list
formatNumberToNumberedList,
// quote
formatGreaterToQuote,
2023-04-23 22:50:14 +08:00
// slash
slashCommand,
2023-04-25 23:52:38 +08:00
// format italic, _italic_
formatUnderscoreToItalic,
2023-04-23 21:26:05 +08:00
],
2023-04-24 20:05:02 +08:00
commandShortcutEvents: [
// backspace
backspaceCommand,
2023-04-27 20:02:20 +08:00
// arrow keys
arrowLeftCommand,
arrowRightCommand,
2023-04-24 20:05:02 +08:00
],
2023-04-20 13:45:46 +08:00
);
}
Widget _buildMobileToolbar(BuildContext context, EditorState editorState) {
return MobileToolbar(editorState: editorState);
}
}