diff --git a/frontend/app_flowy/lib/startup/deps_resolver.dart b/frontend/app_flowy/lib/startup/deps_resolver.dart index e35f8e7f96..47267cc2c9 100644 --- a/frontend/app_flowy/lib/startup/deps_resolver.dart +++ b/frontend/app_flowy/lib/startup/deps_resolver.dart @@ -150,13 +150,6 @@ void _resolveGridDeps(GetIt getIt) { (view, _) => GridBloc(view: view), ); - getIt.registerFactoryParam( - (data, fieldCache) => RowBloc( - rowData: data, - fieldCache: fieldCache, - ), - ); - getIt.registerFactoryParam( (gridId, fieldCache) => GridHeaderBloc( gridId: gridId, diff --git a/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/checkbox_cell_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/checkbox_cell_bloc.dart index 2d937b8cd2..3a4500eb45 100644 --- a/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/checkbox_cell_bloc.dart +++ b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/checkbox_cell_bloc.dart @@ -58,12 +58,11 @@ class CheckboxCellBloc extends Bloc { fieldId: state.cellData.field.id, rowId: state.cellData.rowId, ); + if (isClosed) { + return; + } result.fold( - (cell) { - if (!isClosed) { - add(CheckboxCellEvent.didReceiveCellUpdate(cell)); - } - }, + (cell) => add(CheckboxCellEvent.didReceiveCellUpdate(cell)), (err) => Log.error(err), ); } diff --git a/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/date_cell_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/date_cell_bloc.dart index b4b6d7e152..d7e0c078aa 100644 --- a/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/date_cell_bloc.dart +++ b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/date_cell_bloc.dart @@ -57,19 +57,15 @@ class DateCellBloc extends Bloc { (notificationData) => _loadCellData(), (err) => Log.error(err), ); - }); + }, listenWhen: () => !isClosed); _cellListener.start(); _fieldListener.updateFieldNotifier?.addPublishListener((result) { result.fold( - (field) { - if (!isClosed) { - add(DateCellEvent.didReceiveFieldUpdate(field)); - } - }, + (field) => add(DateCellEvent.didReceiveFieldUpdate(field)), (err) => Log.error(err), ); - }); + }, listenWhen: () => !isClosed); _fieldListener.start(); } @@ -79,12 +75,11 @@ class DateCellBloc extends Bloc { fieldId: state.cellData.field.id, rowId: state.cellData.rowId, ); + if (isClosed) { + return; + } result.fold( - (cell) { - if (!isClosed) { - add(DateCellEvent.didReceiveCellUpdate(cell)); - } - }, + (cell) => add(DateCellEvent.didReceiveCellUpdate(cell)), (err) => Log.error(err), ); } diff --git a/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/number_cell_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/number_cell_bloc.dart index 287d70b701..fbc432c557 100644 --- a/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/number_cell_bloc.dart +++ b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/number_cell_bloc.dart @@ -84,12 +84,12 @@ class NumberCellBloc extends Bloc { fieldId: state.cellData.field.id, rowId: state.cellData.rowId, ); + + if (isClosed) { + return; + } result.fold( - (cell) { - if (!isClosed) { - add(NumberCellEvent.didReceiveCellUpdate(cell)); - } - }, + (cell) => add(NumberCellEvent.didReceiveCellUpdate(cell)), (err) => Log.error(err), ); } diff --git a/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/selection_cell_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/selection_cell_bloc.dart index dbca1b5ae3..ae7c48d81f 100644 --- a/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/selection_cell_bloc.dart +++ b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/selection_cell_bloc.dart @@ -49,16 +49,15 @@ class SelectionCellBloc extends Bloc { fieldId: state.cellData.field.id, rowId: state.cellData.rowId, ); + if (isClosed) { + return; + } result.fold( - (selectOptionContext) { - if (!isClosed) { - add(SelectionCellEvent.didReceiveOptions( - selectOptionContext.options, - selectOptionContext.selectOptions, - )); - } - }, + (selectOptionContext) => add(SelectionCellEvent.didReceiveOptions( + selectOptionContext.options, + selectOptionContext.selectOptions, + )), (err) => Log.error(err), ); } diff --git a/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/selection_editor_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/selection_editor_bloc.dart index 813b779646..0d1b2705e3 100644 --- a/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/selection_editor_bloc.dart +++ b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/selection_editor_bloc.dart @@ -117,16 +117,15 @@ class SelectOptionEditorBloc extends Bloc add(SelectOptionEditorEvent.didReceiveOptions( + selectOptionContext.options, + selectOptionContext.selectOptions, + )), (err) => Log.error(err), ); }, @@ -144,14 +143,10 @@ class SelectOptionEditorBloc extends Bloc add(SelectOptionEditorEvent.didReceiveFieldUpdate(field)), (err) => Log.error(err), ); - }); + }, listenWhen: () => !isClosed); _fieldListener.start(); } } diff --git a/frontend/app_flowy/lib/workspace/application/grid/field/field_cell_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/field/field_cell_bloc.dart index 2c148ae452..576e62e3b1 100644 --- a/frontend/app_flowy/lib/workspace/application/grid/field/field_cell_bloc.dart +++ b/frontend/app_flowy/lib/workspace/application/grid/field/field_cell_bloc.dart @@ -47,14 +47,10 @@ class FieldCellBloc extends Bloc { void _startListening() { _fieldListener.updateFieldNotifier?.addPublishListener((result) { result.fold( - (field) { - if (!isClosed) { - add(FieldCellEvent.didReceiveFieldUpdate(field)); - } - }, + (field) => add(FieldCellEvent.didReceiveFieldUpdate(field)), (err) => Log.error(err), ); - }); + }, listenWhen: () => !isClosed); _fieldListener.start(); } } 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 c37c31ec46..5782371e7a 100644 --- a/frontend/app_flowy/lib/workspace/application/grid/grid_bloc.dart +++ b/frontend/app_flowy/lib/workspace/application/grid/grid_bloc.dart @@ -18,14 +18,14 @@ class GridBloc extends Bloc { final GridListener _gridListener; final GridFieldsListener _fieldListener; final GridFieldCache fieldCache; - final GridRowCache _rowCache; + final GridRowCache rowCache; GridBloc({required View view}) : _fieldListener = GridFieldsListener(gridId: view.id), _gridService = GridService(gridId: view.id), _gridListener = GridListener(gridId: view.id), fieldCache = GridFieldCache(), - _rowCache = GridRowCache(gridId: view.id), + rowCache = GridRowCache(gridId: view.id), super(GridState.initial(view.id)) { on( (event, emit) async { @@ -41,7 +41,7 @@ class GridBloc extends Bloc { emit(state.copyWith(rows: value.rows, listState: value.listState)); }, didReceiveFieldUpdate: (_DidReceiveFieldUpdate value) { - emit(state.copyWith(rows: _rowCache.rows, fields: value.fields)); + emit(state.copyWith(rows: rowCache.rows, fields: value.fields)); }, ); }, @@ -62,7 +62,7 @@ class GridBloc extends Bloc { result.fold( (changeset) { fieldCache.applyChangeset(changeset); - _rowCache.updateFields(fieldCache.unmodifiableFields); + rowCache.updateFields(fieldCache.unmodifiableFields); add(GridEvent.didReceiveFieldUpdate(fieldCache.clonedFields)); }, (err) => Log.error(err), @@ -74,15 +74,15 @@ class GridBloc extends Bloc { result.fold( (changesets) { for (final changeset in changesets) { - _rowCache + rowCache .deleteRows(changeset.deletedRows) - .foldRight(null, (listState, _) => add(GridEvent.didReceiveRowUpdate(_rowCache.rows, listState))); + .foldRight(null, (listState, _) => add(GridEvent.didReceiveRowUpdate(rowCache.rows, listState))); - _rowCache + rowCache .insertRows(changeset.insertedRows) - .foldRight(null, (listState, _) => add(GridEvent.didReceiveRowUpdate(_rowCache.rows, listState))); + .foldRight(null, (listState, _) => add(GridEvent.didReceiveRowUpdate(rowCache.rows, listState))); - _rowCache.updateRows(changeset.updatedRows); + rowCache.updateRows(changeset.updatedRows); } }, (err) => Log.error(err), @@ -107,12 +107,12 @@ class GridBloc extends Bloc { () => result.fold( (fields) { fieldCache.clonedFields = fields.items; - _rowCache.updateWithBlock(grid.blockOrders, fieldCache.unmodifiableFields); + rowCache.updateWithBlock(grid.blockOrders, fieldCache.unmodifiableFields); emit(state.copyWith( grid: Some(grid), fields: fieldCache.clonedFields, - rows: _rowCache.rows, + rows: rowCache.rows, loadingState: GridLoadingState.finish(left(unit)), )); }, @@ -126,7 +126,7 @@ class GridBloc extends Bloc { class GridEvent with _$GridEvent { const factory GridEvent.initial() = InitialGrid; const factory GridEvent.createRow() = _CreateRow; - const factory GridEvent.didReceiveRowUpdate(List rows, GridListState listState) = _DidReceiveRowUpdate; + const factory GridEvent.didReceiveRowUpdate(List rows, GridListState listState) = _DidReceiveRowUpdate; const factory GridEvent.didReceiveFieldUpdate(List fields) = _DidReceiveFieldUpdate; } @@ -136,7 +136,7 @@ class GridState with _$GridState { required String gridId, required Option grid, required List fields, - required List rows, + required List rows, required GridLoadingState loadingState, required GridListState listState, }) = _GridState; 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 08cd01e316..aa4d7343b9 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 @@ -36,11 +36,11 @@ class GridHeaderBloc extends Bloc { } Future _startListening() async { - fieldCache.addListener(() {}, onChanged: (fields) { - if (!isClosed) { - add(GridHeaderEvent.didReceiveFieldUpdate(fields)); - } - }); + fieldCache.addListener( + () {}, + onChanged: (fields) => add(GridHeaderEvent.didReceiveFieldUpdate(fields)), + listenWhen: () => !isClosed, + ); } @override 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 0f2118fea1..441ce4c963 100644 --- a/frontend/app_flowy/lib/workspace/application/grid/grid_service.dart +++ b/frontend/app_flowy/lib/workspace/application/grid/grid_service.dart @@ -5,9 +5,6 @@ import 'package:flowy_sdk/protobuf/flowy-folder-data-model/view.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart'; import 'package:flutter/foundation.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; -import 'package:app_flowy/workspace/application/grid/row/row_service.dart'; - -part 'grid_service.freezed.dart'; class GridService { final String gridId; @@ -74,11 +71,16 @@ class GridFieldCache { _fieldNotifier.addListener(() => onFieldChanged(clonedFields)); } - void addListener(VoidCallback listener, {void Function(List)? onChanged}) { + void addListener(VoidCallback listener, {void Function(List)? onChanged, bool Function()? listenWhen}) { _fieldNotifier.addListener(() { if (onChanged != null) { onChanged(clonedFields); } + + if (listenWhen != null && listenWhen() == false) { + return; + } + listener(); }); } @@ -130,98 +132,3 @@ class GridFieldCache { _fieldNotifier.dispose(); } } - -class GridRowCache { - final String gridId; - UnmodifiableListView _fields = UnmodifiableListView([]); - List _rows = []; - - GridRowCache({required this.gridId}); - - List get rows => [..._rows]; - - void updateWithBlock(List blocks, UnmodifiableListView fields) { - _fields = fields; - _rows = blocks.expand((block) => block.rowOrders).map((rowOrder) { - return RowData.fromBlockRow(gridId, rowOrder, _fields); - }).toList(); - } - - void updateFields(UnmodifiableListView fields) { - if (fields.isEmpty) { - return; - } - - _fields = fields; - _rows = _rows.map((row) => row.copyWith(fields: fields)).toList(); - } - - Option deleteRows(List deletedRows) { - if (deletedRows.isEmpty) { - return none(); - } - - final List newRows = []; - final DeletedIndex deletedIndex = []; - final Map deletedRowMap = {for (var rowOrder in deletedRows) rowOrder.rowId: rowOrder}; - _rows.asMap().forEach((index, value) { - if (deletedRowMap[value.rowId] == null) { - newRows.add(value); - } else { - deletedIndex.add(Tuple2(index, value)); - } - }); - _rows = newRows; - - return Some(GridListState.delete(deletedIndex)); - } - - Option insertRows(List createdRows) { - if (createdRows.isEmpty) { - return none(); - } - - InsertedIndexs insertIndexs = []; - for (final newRow in createdRows) { - if (newRow.hasIndex()) { - insertIndexs.add(Tuple2(newRow.index, newRow.rowOrder.rowId)); - _rows.insert(newRow.index, _toRowData(newRow.rowOrder)); - } else { - insertIndexs.add(Tuple2(newRow.index, newRow.rowOrder.rowId)); - _rows.add(_toRowData(newRow.rowOrder)); - } - } - - return Some(GridListState.insert(insertIndexs)); - } - - void updateRows(List updatedRows) { - if (updatedRows.isEmpty) { - return; - } - - final List updatedIndexs = []; - for (final updatedRow in updatedRows) { - final index = _rows.indexWhere((row) => row.rowId == updatedRow.rowId); - if (index != -1) { - _rows.removeAt(index); - _rows.insert(index, _toRowData(updatedRow)); - updatedIndexs.add(index); - } - } - } - - RowData _toRowData(RowOrder rowOrder) { - return RowData.fromBlockRow(gridId, rowOrder, _fields); - } -} - -typedef InsertedIndexs = List>; -typedef DeletedIndex = List>; - -@freezed -class GridListState with _$GridListState { - const factory GridListState.insert(InsertedIndexs items) = _Insert; - const factory GridListState.delete(DeletedIndex items) = _Delete; - const factory GridListState.initial() = InitialListState; -} diff --git a/frontend/app_flowy/lib/workspace/application/grid/row/row_action_sheet_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/row/row_action_sheet_bloc.dart index 93ee70afa0..16f8679b2c 100644 --- a/frontend/app_flowy/lib/workspace/application/grid/row/row_action_sheet_bloc.dart +++ b/frontend/app_flowy/lib/workspace/application/grid/row/row_action_sheet_bloc.dart @@ -11,7 +11,7 @@ part 'row_action_sheet_bloc.freezed.dart'; class RowActionSheetBloc extends Bloc { final RowService _rowService; - RowActionSheetBloc({required RowData rowData}) + RowActionSheetBloc({required GridRow rowData}) : _rowService = RowService(gridId: rowData.gridId, rowId: rowData.rowId), super(RowActionSheetState.initial(rowData)) { on( @@ -49,10 +49,10 @@ class RowActionSheetEvent with _$RowActionSheetEvent { @freezed class RowActionSheetState with _$RowActionSheetState { const factory RowActionSheetState({ - required RowData rowData, + required GridRow rowData, }) = _RowActionSheetState; - factory RowActionSheetState.initial(RowData rowData) => RowActionSheetState( + factory RowActionSheetState.initial(GridRow rowData) => RowActionSheetState( rowData: rowData, ); } diff --git a/frontend/app_flowy/lib/workspace/application/grid/row/row_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/row/row_bloc.dart index 81bb8b190c..e27c3a7b29 100644 --- a/frontend/app_flowy/lib/workspace/application/grid/row/row_bloc.dart +++ b/frontend/app_flowy/lib/workspace/application/grid/row/row_bloc.dart @@ -18,11 +18,16 @@ class RowBloc extends Bloc { final RowService _rowService; final RowListener _rowlistener; final GridFieldCache _fieldCache; + final GridRowCache _rowCache; - RowBloc({required RowData rowData, required GridFieldCache fieldCache}) - : _rowService = RowService(gridId: rowData.gridId, rowId: rowData.rowId), - _fieldCache = fieldCache, + RowBloc({ + required GridRow rowData, + required GridFieldCache fieldCache, + required GridRowCache rowCache, + }) : _rowService = RowService(gridId: rowData.gridId, rowId: rowData.rowId), _rowlistener = RowListener(rowId: rowData.rowId), + _fieldCache = fieldCache, + _rowCache = rowCache, super(RowState.initial(rowData)) { on( (event, emit) async { @@ -76,37 +81,30 @@ class RowBloc extends Bloc { } Future _startListening() async { - _rowlistener.updateRowNotifier?.addPublishListener((result) { - result.fold( - (row) { - if (!isClosed) { - add(RowEvent.didUpdateRow(row)); - } - }, - (err) => Log.error(err), - ); - }); + _rowlistener.updateRowNotifier?.addPublishListener( + (result) { + result.fold( + (row) => add(RowEvent.didUpdateRow(row)), + (err) => Log.error(err), + ); + }, + listenWhen: () => !isClosed, + ); - _fieldCache.addListener(() { - if (!isClosed) { - add(const RowEvent.fieldsDidUpdate()); - } - }); + _fieldCache.addListener( + () => add(const RowEvent.fieldsDidUpdate()), + listenWhen: () => !isClosed, + ); _rowlistener.start(); } Future _loadRow(Emitter emit) async { - _rowService.getRow().then((result) { - return result.fold( - (row) { - if (!isClosed) { - add(RowEvent.didLoadRow(row)); - } - }, - (err) => Log.error(err), - ); - }); + final data = await _rowCache.getRowData(state.rowData.rowId); + if (isClosed) { + return; + } + data.foldRight(null, (data, _) => add(RowEvent.didLoadRow(data))); } CellDataMap _makeCellDatas(Row row, List fields) { @@ -137,12 +135,12 @@ class RowEvent with _$RowEvent { @freezed class RowState with _$RowState { const factory RowState({ - required RowData rowData, + required GridRow rowData, required Future> row, required Option cellDataMap, }) = _RowState; - factory RowState.initial(RowData rowData) => RowState( + factory RowState.initial(GridRow rowData) => RowState( rowData: rowData, row: Future(() => none()), cellDataMap: none(), diff --git a/frontend/app_flowy/lib/workspace/application/grid/row/row_service.dart b/frontend/app_flowy/lib/workspace/application/grid/row/row_service.dart index 412dea9003..25985cb924 100644 --- a/frontend/app_flowy/lib/workspace/application/grid/row/row_service.dart +++ b/frontend/app_flowy/lib/workspace/application/grid/row/row_service.dart @@ -1,5 +1,8 @@ +import 'dart:collection'; + import 'package:dartz/dartz.dart'; import 'package:flowy_sdk/dispatch/dispatch.dart'; +import 'package:flowy_sdk/log.dart'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-grid/row_entities.pb.dart'; @@ -57,6 +60,115 @@ class RowService { } } +class GridRowCache { + final String gridId; + UnmodifiableListView _fields = UnmodifiableListView([]); + HashMap rowDataMap = HashMap(); + + List _rows = []; + + GridRowCache({required this.gridId}); + + List get rows => [..._rows]; + + Future> getRowData(String rowId) async { + final Row? data = rowDataMap[rowId]; + if (data != null) { + return Future(() => Some(data)); + } + + final payload = RowIdentifierPayload.create() + ..gridId = gridId + ..rowId = rowId; + + final result = await GridEventGetRow(payload).send(); + return Future(() { + return result.fold( + (data) { + data.freeze(); + rowDataMap[data.id] = data; + return Some(data); + }, + (err) { + Log.error(err); + return none(); + }, + ); + }); + } + + void updateWithBlock(List blocks, UnmodifiableListView fields) { + _fields = fields; + _rows = blocks.expand((block) => block.rowOrders).map((rowOrder) { + return GridRow.fromBlockRow(gridId, rowOrder, _fields); + }).toList(); + } + + void updateFields(UnmodifiableListView fields) { + if (fields.isEmpty) { + return; + } + + _fields = fields; + _rows = _rows.map((row) => row.copyWith(fields: fields)).toList(); + } + + Option deleteRows(List deletedRows) { + if (deletedRows.isEmpty) { + return none(); + } + + final List newRows = []; + final DeletedIndex deletedIndex = []; + final Map deletedRowMap = {for (var rowOrder in deletedRows) rowOrder.rowId: rowOrder}; + _rows.asMap().forEach((index, value) { + if (deletedRowMap[value.rowId] == null) { + newRows.add(value); + } else { + deletedIndex.add(Tuple2(index, value)); + } + }); + _rows = newRows; + + return Some(GridListState.delete(deletedIndex)); + } + + Option insertRows(List createdRows) { + if (createdRows.isEmpty) { + return none(); + } + + InsertedIndexs insertIndexs = []; + for (final createdRow in createdRows) { + final gridRow = GridRow.fromBlockRow(gridId, createdRow.rowOrder, _fields); + insertIndexs.add(Tuple2(createdRow.index, gridRow.rowId)); + _rows.insert(createdRow.index, gridRow); + } + + return Some(GridListState.insert(insertIndexs)); + } + + void updateRows(List updatedRows) { + if (updatedRows.isEmpty) { + return; + } + + final List updatedIndexs = []; + for (final updatedRow in updatedRows) { + final index = _rows.indexWhere((row) => row.rowId == updatedRow.rowId); + if (index != -1) { + _rows.removeAt(index); + _rows.insert(index, _toRowData(updatedRow)); + updatedIndexs.add(index); + } + } + } + + GridRow _toRowData(RowOrder rowOrder) { + return GridRow.fromBlockRow(gridId, rowOrder, _fields); + } +} + @freezed class CellData with _$CellData { const factory CellData({ @@ -68,20 +180,32 @@ class CellData with _$CellData { } @freezed -class RowData with _$RowData { - const factory RowData({ +class GridRow with _$GridRow { + const factory GridRow({ required String gridId, required String rowId, required List fields, required double height, - }) = _RowData; + required Future> data, + }) = _GridRow; - factory RowData.fromBlockRow(String gridId, RowOrder row, List fields) { - return RowData( + factory GridRow.fromBlockRow(String gridId, RowOrder row, List fields) { + return GridRow( gridId: gridId, - rowId: row.rowId, fields: fields, + rowId: row.rowId, + data: Future(() => none()), height: row.height.toDouble(), ); } } + +typedef InsertedIndexs = List>; +typedef DeletedIndex = List>; + +@freezed +class GridListState with _$GridListState { + const factory GridListState.insert(InsertedIndexs items) = _Insert; + const factory GridListState.delete(DeletedIndex items) = _Delete; + const factory GridListState.initial() = InitialListState; +} diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/grid_page.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/grid_page.dart index 74215f4b80..1acdf5db2f 100755 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/grid_page.dart +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/grid_page.dart @@ -1,5 +1,6 @@ import 'package:app_flowy/startup/startup.dart'; import 'package:app_flowy/workspace/application/grid/grid_bloc.dart'; +import 'package:app_flowy/workspace/application/grid/row/row_bloc.dart'; import 'package:app_flowy/workspace/application/grid/row/row_service.dart'; import 'package:flowy_infra_ui/style_widget/scrolling/styled_list.dart'; import 'package:flowy_infra_ui/style_widget/scrolling/styled_scroll_bar.dart'; @@ -221,14 +222,19 @@ class _GridRowsState extends State<_GridRows> { ); } - Widget _renderRow(BuildContext context, RowData rowData, Animation animation) { - final fieldCache = context.read().fieldCache; + Widget _renderRow(BuildContext context, GridRow rowData, Animation animation) { + final bloc = context.read(); + final fieldCache = bloc.fieldCache; + final rowCache = bloc.rowCache; return SizeTransition( sizeFactor: animation, child: GridRowWidget( - data: rowData, - fieldCache: fieldCache, + blocBuilder: () => RowBloc( + rowData: rowData, + fieldCache: fieldCache, + rowCache: rowCache, + ), key: ValueKey(rowData.rowId), ), ); 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 edac8bc2fe..6a22c88ca5 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 @@ -12,9 +12,12 @@ import 'package:provider/provider.dart'; import 'row_action_sheet.dart'; class GridRowWidget extends StatefulWidget { - final RowData data; - final GridFieldCache fieldCache; - const GridRowWidget({required this.data, required this.fieldCache, Key? key}) : super(key: key); + final RowBloc Function() blocBuilder; + + const GridRowWidget({ + required this.blocBuilder, + Key? key, + }) : super(key: key); @override State createState() => _GridRowWidgetState(); @@ -26,7 +29,8 @@ class _GridRowWidgetState extends State { @override void initState() { - _rowBloc = getIt(param1: widget.data, param2: widget.fieldCache)..add(const RowEvent.initial()); + _rowBloc = widget.blocBuilder(); + _rowBloc.add(const RowEvent.initial()); _rowStateNotifier = _RegionStateNotifier(); super.initState(); } diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/row/row_action_sheet.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/row/row_action_sheet.dart index 458e934756..40e77d9c43 100644 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/row/row_action_sheet.dart +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/row/row_action_sheet.dart @@ -14,7 +14,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; class GridRowActionSheet extends StatelessWidget { - final RowData rowData; + final GridRow rowData; const GridRowActionSheet({required this.rowData, Key? key}) : super(key: key); @override diff --git a/frontend/app_flowy/packages/flowy_infra/lib/notifier.dart b/frontend/app_flowy/packages/flowy_infra/lib/notifier.dart index 0079ba51a1..7eaf139f0c 100644 --- a/frontend/app_flowy/packages/flowy_infra/lib/notifier.dart +++ b/frontend/app_flowy/packages/flowy_infra/lib/notifier.dart @@ -31,12 +31,18 @@ class PublishNotifier extends ChangeNotifier { T? get currentValue => _value; - void addPublishListener(void Function(T) callback) { + void addPublishListener(void Function(T) callback, {bool Function()? listenWhen}) { super.addListener( () { - if (_value != null) { - callback(_value!); + if (_value == null) { + return; } + + if (listenWhen != null && listenWhen() == false) { + return; + } + + callback(_value!); }, ); }