chore: cache cell data

This commit is contained in:
appflowy 2022-04-23 15:11:05 +08:00
parent 5af378c810
commit ec16fbe551
2 changed files with 25 additions and 21 deletions

View File

@ -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<T>() {
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<String, GridCell>;
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 extends GridCellCacheData>(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<T>(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 {

View File

@ -159,7 +159,7 @@ class _RowCells extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocBuilder<RowBloc, RowState>(
buildWhen: (previous, current) => previous.cellDataMap != current.cellDataMap,
buildWhen: (previous, current) => previous.cellDataMap.length != current.cellDataMap.length,
builder: (context, state) {
return Row(
mainAxisSize: MainAxisSize.min,