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

99 lines
2.9 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);
2023-04-25 19:58:48 +08:00
if (PlatformExtension.isDesktopOrWeb) {
return FloatingToolbar(
editorState: editorState,
child: _buildEditor(context, editorState));
} else {
return Column(
children: [
Expanded(child: _buildEditor(context, editorState)),
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) {
return AppFlowyEditor(
editorState: editorState,
themeData: themeData,
autoFocus: editorState.document.isEmpty,
// customBuilders: {
// 'paragraph': TextBlockComponentBuilder(),
// 'todo_list': TodoListBlockComponentBuilder(),
// 'bulleted_list': BulletedListBlockComponentBuilder(),
// 'numbered_list': NumberedListBlockComponentBuilder(),
// 'quote': QuoteBlockComponentBuilder(),
// },
blockComponentBuilders: {
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
// slash
slashCommand,
2023-04-23 21:26:05 +08:00
],
2023-04-24 20:05:02 +08:00
commandShortcutEvents: [
// backspace
backspaceCommand,
],
2023-04-20 13:45:46 +08:00
);
}
Widget _buildMobileToolbar(BuildContext context, EditorState editorState) {
return MobileToolbar(editorState: editorState);
}
}