From ec16fbe551fd59066afa3c0fb9f64b6c7414b8ee Mon Sep 17 00:00:00 2001 From: appflowy Date: Sat, 23 Apr 2022 15:11:05 +0800 Subject: [PATCH] chore: cache cell data --- .../application/grid/cell/cell_service.dart | 44 ++++++++++--------- .../grid/src/widgets/row/grid_row.dart | 2 +- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/frontend/app_flowy/lib/workspace/application/grid/cell/cell_service.dart b/frontend/app_flowy/lib/workspace/application/grid/cell/cell_service.dart index 2156d86ebc..49a04586b3 100644 --- a/frontend/app_flowy/lib/workspace/application/grid/cell/cell_service.dart +++ b/frontend/app_flowy/lib/workspace/application/grid/cell/cell_service.dart @@ -14,10 +14,16 @@ part 'cell_service.freezed.dart'; class GridCellContext { GridCell cellData; GridCellCache cellCache; + late GridCellCacheKey _cacheKey; GridCellContext({ required this.cellData, required this.cellCache, - }); + }) { + _cacheKey = GridCellCacheKey( + objectId: "$hashCode", + fieldId: cellData.field.id, + ); + } String get gridId => cellData.gridId; @@ -31,22 +37,22 @@ class GridCellContext { Field get field => cellData.field; - GridCellCacheKey get cacheKey => GridCellCacheKey(rowId: cellData.rowId, fieldId: cellData.field.id); + GridCellCacheKey get cacheKey => _cacheKey; T? getCacheData() { return cellCache.get(cacheKey); } void setCacheData(dynamic data) { - cellCache.insert(GridCellCacheData(key: cacheKey, value: data)); + cellCache.insert(GridCellCacheData(key: cacheKey, object: data)); } void onFieldChanged(VoidCallback callback) { - cellCache.addListener(fieldId, rowId, callback); + cellCache.addListener(cacheKey, callback); } void removeListener() { - cellCache.removeListener(fieldId, rowId); + cellCache.removeListener(cacheKey); } } @@ -55,22 +61,20 @@ typedef CellDataMap = LinkedHashMap; class GridCellCacheData { GridCellCacheKey key; - dynamic value; + dynamic object; GridCellCacheData({ required this.key, - required this.value, + required this.object, }); } class GridCellCacheKey { final String fieldId; - final String rowId; + final String objectId; GridCellCacheKey({ required this.fieldId, - required this.rowId, + required this.objectId, }); - - String get cellId => "$rowId + $fieldId"; } abstract class GridCellFieldDelegate { @@ -101,18 +105,18 @@ class GridCellCache { }); } - void addListener(String fieldId, String rowId, VoidCallback callback) { - var map = _cellListenerByFieldId[fieldId]; + void addListener(GridCellCacheKey cacheKey, VoidCallback callback) { + var map = _cellListenerByFieldId[cacheKey.fieldId]; if (map == null) { - _cellListenerByFieldId[fieldId] = {}; - map = _cellListenerByFieldId[fieldId]; + _cellListenerByFieldId[cacheKey.fieldId] = {}; + map = _cellListenerByFieldId[cacheKey.fieldId]; } - map![rowId] = callback; + map![cacheKey.objectId] = callback; } - void removeListener(String fieldId, String rowId) { - _cellListenerByFieldId[fieldId]?.remove(rowId); + void removeListener(GridCellCacheKey cacheKey) { + _cellListenerByFieldId[cacheKey.fieldId]?.remove(cacheKey.objectId); } void insert(T item) { @@ -122,7 +126,7 @@ class GridCellCache { map = _cellCacheByFieldId[item.key.fieldId]; } - map![item.key.cellId] = item.value; + map![item.key.objectId] = item.object; } T? get(GridCellCacheKey key) { @@ -130,7 +134,7 @@ class GridCellCache { if (map == null) { return null; } else { - final object = map[key.cellId]; + final object = map[key.objectId]; if (object is T) { return object; } else { diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/row/grid_row.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/row/grid_row.dart index cc56d3bed0..f5ebba8921 100755 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/row/grid_row.dart +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/row/grid_row.dart @@ -159,7 +159,7 @@ class _RowCells extends StatelessWidget { @override Widget build(BuildContext context) { return BlocBuilder( - buildWhen: (previous, current) => previous.cellDataMap != current.cellDataMap, + buildWhen: (previous, current) => previous.cellDataMap.length != current.cellDataMap.length, builder: (context, state) { return Row( mainAxisSize: MainAxisSize.min,