doc_page.dart 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import 'dart:io';
  2. import 'package:app_flowy/startup/startup.dart';
  3. import 'package:app_flowy/workspace/application/doc/doc_edit_bloc.dart';
  4. import 'package:app_flowy/workspace/domain/i_doc.dart';
  5. import 'package:flowy_editor/flowy_editor.dart';
  6. import 'package:flutter/material.dart';
  7. import 'package:flutter_bloc/flutter_bloc.dart';
  8. // ignore: must_be_immutable
  9. class DocPage extends StatefulWidget {
  10. late EditorController controller;
  11. late DocEditBloc editBloc;
  12. final FlowyDoc doc;
  13. DocPage({Key? key, required this.doc}) : super(key: key) {
  14. editBloc = getIt<DocEditBloc>(param1: doc.id);
  15. controller = EditorController(
  16. document: doc.document,
  17. selection: const TextSelection.collapsed(offset: 0),
  18. );
  19. }
  20. @override
  21. State<DocPage> createState() => _DocPageState();
  22. }
  23. class _DocPageState extends State<DocPage> {
  24. final FocusNode _focusNode = FocusNode();
  25. @override
  26. Widget build(BuildContext context) {
  27. return BlocProvider.value(
  28. value: widget.editBloc,
  29. child: BlocBuilder<DocEditBloc, DocEditState>(
  30. builder: (ctx, state) {
  31. return Column(
  32. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  33. children: [
  34. _renderEditor(widget.controller),
  35. _renderToolbar(widget.controller),
  36. ],
  37. );
  38. },
  39. ),
  40. );
  41. }
  42. @override
  43. Future<void> dispose() async {
  44. widget.editBloc.add(const DocEditEvent.close());
  45. widget.editBloc.close();
  46. super.dispose();
  47. await widget.doc.close();
  48. }
  49. Widget _renderEditor(EditorController controller) {
  50. final editor = FlowyEditor(
  51. controller: controller,
  52. focusNode: _focusNode,
  53. scrollable: true,
  54. autoFocus: false,
  55. expands: false,
  56. padding: const EdgeInsets.symmetric(horizontal: 8.0),
  57. readOnly: false,
  58. scrollBottomInset: 0,
  59. scrollController: ScrollController(),
  60. );
  61. return Expanded(
  62. child: Padding(padding: const EdgeInsets.all(10), child: editor),
  63. );
  64. }
  65. Widget _renderToolbar(EditorController controller) {
  66. return FlowyToolbar.basic(
  67. controller: controller,
  68. onImageSelectCallback: _onImageSelection,
  69. );
  70. }
  71. Future<String> _onImageSelection(File file) {
  72. throw UnimplementedError();
  73. }
  74. }