database_view.dart 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  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. void _listenOnLayoutChanged() {
  29. _viewListener.start(
  30. onViewUpdated: (result) {
  31. result.fold(
  32. (updatedView) {
  33. if (_view.layout != updatedView.layout) {
  34. _innerPlugin = _makeInnerPlugin(updatedView);
  35. getIt<HomeStackManager>().setPlugin(_innerPlugin);
  36. }
  37. _view = updatedView;
  38. },
  39. (r) => null,
  40. );
  41. },
  42. );
  43. }
  44. }
  45. Plugin _makeInnerPlugin(ViewPB view) {
  46. return makePlugin(pluginType: view.pluginType, data: view);
  47. }