Skip to content

Commit e8540b4

Browse files
committed
chore: fix potential issue when call notifier after it was disposed
1 parent 23900b4 commit e8540b4

File tree

5 files changed

+27
-24
lines changed

5 files changed

+27
-24
lines changed

frontend/app_flowy/lib/workspace/application/grid/cell/cell_service/data_cache.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ class GridCellCache {
104104
}
105105

106106
Future<void> dispose() async {
107+
_fieldListenerByFieldId.clear();
108+
_cellDataByFieldId.clear();
107109
fieldDelegate.dispose();
108110
}
109111
}

frontend/app_flowy/lib/workspace/application/grid/grid_bloc.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ class GridBloc extends Bloc<GridEvent, GridState> {
9393

9494
emit(state.copyWith(
9595
grid: Some(grid),
96-
fields: fieldCache.clonedFields,
96+
fields: fieldCache.fields,
9797
rows: rowCache.clonedRows,
9898
loadingState: GridLoadingState.finish(left(unit)),
9999
));

frontend/app_flowy/lib/workspace/application/grid/grid_header_bloc.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class GridHeaderBloc extends Bloc<GridHeaderEvent, GridHeaderState> {
1515
GridHeaderBloc({
1616
required this.gridId,
1717
required this.fieldCache,
18-
}) : super(GridHeaderState.initial(fieldCache.clonedFields)) {
18+
}) : super(GridHeaderState.initial(fieldCache.fields)) {
1919
on<GridHeaderEvent>(
2020
(event, emit) async {
2121
await event.map(

frontend/app_flowy/lib/workspace/application/grid/grid_service.dart

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ typedef ChangesetListener = void Function(GridFieldChangeset);
5959
class GridFieldCache {
6060
final String gridId;
6161
late final GridFieldsListener _fieldListener;
62-
final FieldsNotifier _fieldNotifier = FieldsNotifier();
62+
FieldsNotifier? _fieldNotifier = FieldsNotifier();
6363
final List<ChangesetListener> _changesetListener = [];
6464

6565
GridFieldCache({required this.gridId}) {
@@ -81,15 +81,16 @@ class GridFieldCache {
8181

8282
Future<void> dispose() async {
8383
await _fieldListener.stop();
84-
_fieldNotifier.dispose();
84+
_fieldNotifier?.dispose();
85+
_fieldNotifier = null;
8586
}
8687

87-
UnmodifiableListView<Field> get unmodifiableFields => UnmodifiableListView(_fieldNotifier.fields);
88+
UnmodifiableListView<Field> get unmodifiableFields => UnmodifiableListView(_fieldNotifier?.fields ?? []);
8889

89-
List<Field> get clonedFields => [..._fieldNotifier.fields];
90+
List<Field> get fields => [..._fieldNotifier?.fields ?? []];
9091

9192
set fields(List<Field> fields) {
92-
_fieldNotifier.fields = [...fields];
93+
_fieldNotifier?.fields = [...fields];
9394
}
9495

9596
VoidCallback addListener(
@@ -100,20 +101,20 @@ class GridFieldCache {
100101
}
101102

102103
if (onChanged != null) {
103-
onChanged(clonedFields);
104+
onChanged(fields);
104105
}
105106

106107
if (listener != null) {
107108
listener();
108109
}
109110
}
110111

111-
_fieldNotifier.addListener(f);
112+
_fieldNotifier?.addListener(f);
112113
return f;
113114
}
114115

115116
void removeListener(VoidCallback f) {
116-
_fieldNotifier.removeListener(f);
117+
_fieldNotifier?.removeListener(f);
117118
}
118119

119120
void addChangesetListener(ChangesetListener listener) {
@@ -131,43 +132,43 @@ class GridFieldCache {
131132
if (deletedFields.isEmpty) {
132133
return;
133134
}
134-
final List<Field> fields = _fieldNotifier.fields;
135+
final List<Field> newFields = fields;
135136
final Map<String, FieldOrder> deletedFieldMap = {
136137
for (var fieldOrder in deletedFields) fieldOrder.fieldId: fieldOrder
137138
};
138139

139-
fields.retainWhere((field) => (deletedFieldMap[field.id] == null));
140-
_fieldNotifier.fields = fields;
140+
newFields.retainWhere((field) => (deletedFieldMap[field.id] == null));
141+
_fieldNotifier?.fields = newFields;
141142
}
142143

143144
void _insertFields(List<IndexField> insertedFields) {
144145
if (insertedFields.isEmpty) {
145146
return;
146147
}
147-
final List<Field> fields = _fieldNotifier.fields;
148+
final List<Field> newFields = fields;
148149
for (final indexField in insertedFields) {
149-
if (fields.length > indexField.index) {
150-
fields.insert(indexField.index, indexField.field_1);
150+
if (newFields.length > indexField.index) {
151+
newFields.insert(indexField.index, indexField.field_1);
151152
} else {
152-
fields.add(indexField.field_1);
153+
newFields.add(indexField.field_1);
153154
}
154155
}
155-
_fieldNotifier.fields = fields;
156+
_fieldNotifier?.fields = newFields;
156157
}
157158

158159
void _updateFields(List<Field> updatedFields) {
159160
if (updatedFields.isEmpty) {
160161
return;
161162
}
162-
final List<Field> fields = _fieldNotifier.fields;
163+
final List<Field> newFields = fields;
163164
for (final updatedField in updatedFields) {
164-
final index = fields.indexWhere((field) => field.id == updatedField.id);
165+
final index = newFields.indexWhere((field) => field.id == updatedField.id);
165166
if (index != -1) {
166-
fields.removeAt(index);
167-
fields.insert(index, updatedField);
167+
newFields.removeAt(index);
168+
newFields.insert(index, updatedField);
168169
}
169170
}
170-
_fieldNotifier.fields = fields;
171+
_fieldNotifier?.fields = newFields;
171172
}
172173
}
173174

frontend/app_flowy/lib/workspace/application/grid/setting/property_bloc.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class GridPropertyBloc extends Bloc<GridPropertyEvent, GridPropertyState> {
1414

1515
GridPropertyBloc({required String gridId, required GridFieldCache fieldCache})
1616
: _fieldCache = fieldCache,
17-
super(GridPropertyState.initial(gridId, fieldCache.clonedFields)) {
17+
super(GridPropertyState.initial(gridId, fieldCache.fields)) {
1818
on<GridPropertyEvent>(
1919
(event, emit) async {
2020
await event.map(

0 commit comments

Comments
 (0)