|  | @@ -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 {
 |