database_view.dart 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import 'package:appflowy/startup/plugin/plugin.dart';
  2. import 'package:appflowy/startup/startup.dart';
  3. import 'package:appflowy/workspace/application/view/view_ext.dart';
  4. import 'package:appflowy/workspace/application/view/view_listener.dart';
  5. import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
  6. import '../../workspace/presentation/home/home_stack.dart';
  7. /// [DatabaseViewPlugin] is used to build the grid, calendar, and board.
  8. /// It is a wrapper of the [Plugin] class. The underlying [Plugin] is
  9. /// determined by the [ViewPB.pluginType] field.
  10. ///
  11. class DatabaseViewPlugin extends Plugin {
  12. final ViewListener _viewListener;
  13. ViewPB _view;
  14. Plugin _innerPlugin;
  15. DatabaseViewPlugin({
  16. required ViewPB view,
  17. }) : _view = view,
  18. _innerPlugin = _makeInnerPlugin(view),
  19. _viewListener = ViewListener(view: view) {
  20. _listenOnLayoutChanged();
  21. }
  22. @override
  23. PluginId get id => _innerPlugin.id;
  24. @override
  25. PluginType get pluginType => _innerPlugin.pluginType;
  26. @override
  27. PluginWidgetBuilder get widgetBuilder => _innerPlugin.widgetBuilder;
  28. @override
  29. void dispose() {
  30. _viewListener.stop();
  31. super.dispose();
  32. }
  33. void _listenOnLayoutChanged() {
  34. _viewListener.start(
  35. onViewUpdated: (result) {
  36. result.fold(
  37. (updatedView) {
  38. if (_view.layout != updatedView.layout) {
  39. _innerPlugin = _makeInnerPlugin(updatedView);
  40. getIt<HomeStackManager>().setPlugin(_innerPlugin);
  41. }
  42. _view = updatedView;
  43. },
  44. (r) => null,
  45. );
  46. },
  47. );
  48. }
  49. }
  50. Plugin _makeInnerPlugin(ViewPB view) {
  51. return makePlugin(pluginType: view.pluginType, data: view);
  52. }