diff --git a/frontend/app_flowy/lib/workspace/application/grid/cell/cell_service/data_cache.dart b/frontend/app_flowy/lib/workspace/application/grid/cell/cell_service/data_cache.dart index 409c236881..5e09573506 100644 --- a/frontend/app_flowy/lib/workspace/application/grid/cell/cell_service/data_cache.dart +++ b/frontend/app_flowy/lib/workspace/application/grid/cell/cell_service/data_cache.dart @@ -104,6 +104,8 @@ class GridCellCache { } Future dispose() async { + _fieldListenerByFieldId.clear(); + _cellDataByFieldId.clear(); fieldDelegate.dispose(); } } diff --git a/frontend/app_flowy/lib/workspace/application/grid/grid_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/grid_bloc.dart index 7f35d50978..357ccadcd9 100644 --- a/frontend/app_flowy/lib/workspace/application/grid/grid_bloc.dart +++ b/frontend/app_flowy/lib/workspace/application/grid/grid_bloc.dart @@ -93,7 +93,7 @@ class GridBloc extends Bloc { emit(state.copyWith( grid: Some(grid), - fields: fieldCache.clonedFields, + fields: fieldCache.fields, rows: rowCache.clonedRows, loadingState: GridLoadingState.finish(left(unit)), )); diff --git a/frontend/app_flowy/lib/workspace/application/grid/grid_header_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/grid_header_bloc.dart index 3195715413..526dda9085 100644 --- a/frontend/app_flowy/lib/workspace/application/grid/grid_header_bloc.dart +++ b/frontend/app_flowy/lib/workspace/application/grid/grid_header_bloc.dart @@ -15,7 +15,7 @@ class GridHeaderBloc extends Bloc { GridHeaderBloc({ required this.gridId, required this.fieldCache, - }) : super(GridHeaderState.initial(fieldCache.clonedFields)) { + }) : super(GridHeaderState.initial(fieldCache.fields)) { on( (event, emit) async { await event.map( diff --git a/frontend/app_flowy/lib/workspace/application/grid/grid_service.dart b/frontend/app_flowy/lib/workspace/application/grid/grid_service.dart index 98827e6b72..4ed54c5f3b 100644 --- a/frontend/app_flowy/lib/workspace/application/grid/grid_service.dart +++ b/frontend/app_flowy/lib/workspace/application/grid/grid_service.dart @@ -59,7 +59,7 @@ typedef ChangesetListener = void Function(GridFieldChangeset); class GridFieldCache { final String gridId; late final GridFieldsListener _fieldListener; - final FieldsNotifier _fieldNotifier = FieldsNotifier(); + FieldsNotifier? _fieldNotifier = FieldsNotifier(); final List _changesetListener = []; GridFieldCache({required this.gridId}) { @@ -81,15 +81,16 @@ class GridFieldCache { Future dispose() async { await _fieldListener.stop(); - _fieldNotifier.dispose(); + _fieldNotifier?.dispose(); + _fieldNotifier = null; } - UnmodifiableListView get unmodifiableFields => UnmodifiableListView(_fieldNotifier.fields); + UnmodifiableListView get unmodifiableFields => UnmodifiableListView(_fieldNotifier?.fields ?? []); - List get clonedFields => [..._fieldNotifier.fields]; + List get fields => [..._fieldNotifier?.fields ?? []]; set fields(List fields) { - _fieldNotifier.fields = [...fields]; + _fieldNotifier?.fields = [...fields]; } VoidCallback addListener( @@ -100,7 +101,7 @@ class GridFieldCache { } if (onChanged != null) { - onChanged(clonedFields); + onChanged(fields); } if (listener != null) { @@ -108,12 +109,12 @@ class GridFieldCache { } } - _fieldNotifier.addListener(f); + _fieldNotifier?.addListener(f); return f; } void removeListener(VoidCallback f) { - _fieldNotifier.removeListener(f); + _fieldNotifier?.removeListener(f); } void addChangesetListener(ChangesetListener listener) { @@ -131,43 +132,43 @@ class GridFieldCache { if (deletedFields.isEmpty) { return; } - final List fields = _fieldNotifier.fields; + final List newFields = fields; final Map deletedFieldMap = { for (var fieldOrder in deletedFields) fieldOrder.fieldId: fieldOrder }; - fields.retainWhere((field) => (deletedFieldMap[field.id] == null)); - _fieldNotifier.fields = fields; + newFields.retainWhere((field) => (deletedFieldMap[field.id] == null)); + _fieldNotifier?.fields = newFields; } void _insertFields(List insertedFields) { if (insertedFields.isEmpty) { return; } - final List fields = _fieldNotifier.fields; + final List newFields = fields; for (final indexField in insertedFields) { - if (fields.length > indexField.index) { - fields.insert(indexField.index, indexField.field_1); + if (newFields.length > indexField.index) { + newFields.insert(indexField.index, indexField.field_1); } else { - fields.add(indexField.field_1); + newFields.add(indexField.field_1); } } - _fieldNotifier.fields = fields; + _fieldNotifier?.fields = newFields; } void _updateFields(List updatedFields) { if (updatedFields.isEmpty) { return; } - final List fields = _fieldNotifier.fields; + final List newFields = fields; for (final updatedField in updatedFields) { - final index = fields.indexWhere((field) => field.id == updatedField.id); + final index = newFields.indexWhere((field) => field.id == updatedField.id); if (index != -1) { - fields.removeAt(index); - fields.insert(index, updatedField); + newFields.removeAt(index); + newFields.insert(index, updatedField); } } - _fieldNotifier.fields = fields; + _fieldNotifier?.fields = newFields; } } diff --git a/frontend/app_flowy/lib/workspace/application/grid/setting/property_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/setting/property_bloc.dart index 42d2327f5b..a88423e56d 100644 --- a/frontend/app_flowy/lib/workspace/application/grid/setting/property_bloc.dart +++ b/frontend/app_flowy/lib/workspace/application/grid/setting/property_bloc.dart @@ -14,7 +14,7 @@ class GridPropertyBloc extends Bloc { GridPropertyBloc({required String gridId, required GridFieldCache fieldCache}) : _fieldCache = fieldCache, - super(GridPropertyState.initial(gridId, fieldCache.clonedFields)) { + super(GridPropertyState.initial(gridId, fieldCache.fields)) { on( (event, emit) async { await event.map(