block_cache.dart 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import 'dart:async';
  2. import 'package:app_flowy/plugins/grid/application/view/grid_view_listener.dart';
  3. import 'package:flowy_sdk/log.dart';
  4. import 'package:flowy_sdk/protobuf/flowy-grid/block_entities.pb.dart';
  5. import '../field/field_controller.dart';
  6. import '../row/row_cache.dart';
  7. /// Read https://appflowy.gitbook.io/docs/essential-documentation/contribute-to-appflowy/architecture/frontend/grid for more information
  8. class GridBlockCache {
  9. final String gridId;
  10. final BlockPB block;
  11. late GridRowCache _rowCache;
  12. final GridViewListener _gridViewListener;
  13. List<RowInfo> get rows => _rowCache.visibleRows;
  14. GridRowCache get rowCache => _rowCache;
  15. GridBlockCache({
  16. required this.gridId,
  17. required this.block,
  18. required GridFieldController fieldController,
  19. }) : _gridViewListener = GridViewListener(viewId: gridId) {
  20. _rowCache = GridRowCache(
  21. gridId: gridId,
  22. block: block,
  23. notifier: GridRowFieldNotifierImpl(fieldController),
  24. );
  25. _gridViewListener.start(
  26. onRowsChanged: (result) {
  27. result.fold(
  28. (changeset) => _rowCache.applyRowsChanged(changeset),
  29. (err) => Log.error(err),
  30. );
  31. },
  32. onRowsVisibilityChanged: (result) {
  33. result.fold(
  34. (changeset) => _rowCache.applyRowsVisibility(changeset),
  35. (err) => Log.error(err),
  36. );
  37. },
  38. );
  39. }
  40. Future<void> dispose() async {
  41. await _gridViewListener.stop();
  42. await _rowCache.dispose();
  43. }
  44. void addListener({
  45. required void Function(RowsChangedReason) onRowsChanged,
  46. bool Function()? listenWhen,
  47. }) {
  48. _rowCache.onRowsChanged((reason) {
  49. if (listenWhen != null && listenWhen() == false) {
  50. return;
  51. }
  52. onRowsChanged(reason);
  53. });
  54. }
  55. }