chore: add cell cache

This commit is contained in:
appflowy 2022-04-17 08:04:29 +08:00
parent c82754f284
commit e647fd0a57
23 changed files with 131 additions and 91 deletions

View File

@ -171,32 +171,32 @@ void _resolveGridDeps(GetIt getIt) {
),
);
getIt.registerFactoryParam<TextCellBloc, CellData, void>(
getIt.registerFactoryParam<TextCellBloc, GridCellIdentifier, void>(
(cellData, _) => TextCellBloc(
service: CellService(),
cellData: cellData,
),
);
getIt.registerFactoryParam<SelectionCellBloc, CellData, void>(
getIt.registerFactoryParam<SelectionCellBloc, GridCellIdentifier, void>(
(cellData, _) => SelectionCellBloc(
cellData: cellData,
),
);
getIt.registerFactoryParam<NumberCellBloc, CellData, void>(
getIt.registerFactoryParam<NumberCellBloc, GridCellIdentifier, void>(
(cellData, _) => NumberCellBloc(
cellData: cellData,
),
);
getIt.registerFactoryParam<DateCellBloc, CellData, void>(
getIt.registerFactoryParam<DateCellBloc, GridCellIdentifier, void>(
(cellData, _) => DateCellBloc(
cellData: cellData,
cellIdentifier: cellData,
),
);
getIt.registerFactoryParam<CheckboxCellBloc, CellData, void>(
getIt.registerFactoryParam<CheckboxCellBloc, GridCellIdentifier, void>(
(cellData, _) => CheckboxCellBloc(
service: CellService(),
cellData: cellData,

View File

@ -0,0 +1,75 @@
import 'dart:collection';
import 'package:app_flowy/workspace/application/grid/row/row_service.dart';
import 'package:flowy_sdk/log.dart';
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:dartz/dartz.dart';
import 'package:flowy_sdk/dispatch/dispatch.dart';
import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-grid/cell_entities.pb.dart';
class CellService {
CellService();
Future<Either<void, FlowyError>> updateCell({
required String gridId,
required String fieldId,
required String rowId,
required String data,
}) {
final payload = CellChangeset.create()
..gridId = gridId
..fieldId = fieldId
..rowId = rowId
..data = data;
return GridEventUpdateCell(payload).send();
}
Future<Either<Cell, FlowyError>> getCell({
required String gridId,
required String fieldId,
required String rowId,
}) {
final payload = CellIdentifierPayload.create()
..gridId = gridId
..fieldId = fieldId
..rowId = rowId;
return GridEventGetCell(payload).send();
}
}
class CellCache {
final CellService _cellService;
final HashMap<String, Cell> _cellDataMap = HashMap();
CellCache() : _cellService = CellService();
Future<Option<Cell>> getCellData(GridCellIdentifier identifier) async {
final cellId = _cellId(identifier);
final Cell? data = _cellDataMap[cellId];
if (data != null) {
return Future(() => Some(data));
}
final result = await _cellService.getCell(
gridId: identifier.gridId,
fieldId: identifier.field.id,
rowId: identifier.rowId,
);
return result.fold(
(cell) {
_cellDataMap[_cellId(identifier)] = cell;
return Some(cell);
},
(err) {
Log.error(err);
return none();
},
);
}
String _cellId(GridCellIdentifier identifier) {
return "${identifier.rowId}/${identifier.field.id}";
}
}

View File

@ -1,4 +1,4 @@
import 'package:app_flowy/workspace/application/grid/cell_bloc/cell_listener.dart';
import 'package:app_flowy/workspace/application/grid/cell/cell_listener.dart';
import 'package:app_flowy/workspace/application/grid/row/row_service.dart';
import 'package:flowy_sdk/log.dart';
import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart' show Cell;
@ -15,7 +15,7 @@ class CheckboxCellBloc extends Bloc<CheckboxCellEvent, CheckboxCellState> {
CheckboxCellBloc({
required CellService service,
required CellData cellData,
required GridCellIdentifier cellData,
}) : _service = service,
_listener = CellListener(rowId: cellData.rowId, fieldId: cellData.field.id),
super(CheckboxCellState.initial(cellData)) {
@ -87,11 +87,11 @@ class CheckboxCellEvent with _$CheckboxCellEvent {
@freezed
class CheckboxCellState with _$CheckboxCellState {
const factory CheckboxCellState({
required CellData cellData,
required GridCellIdentifier cellData,
required bool isSelected,
}) = _CheckboxCellState;
factory CheckboxCellState.initial(CellData cellData) {
factory CheckboxCellState.initial(GridCellIdentifier cellData) {
return CheckboxCellState(cellData: cellData, isSelected: _isSelected(cellData.cell));
}
}

View File

@ -1,4 +1,4 @@
import 'package:app_flowy/workspace/application/grid/cell_bloc/cell_listener.dart';
import 'package:app_flowy/workspace/application/grid/cell/cell_listener.dart';
import 'package:app_flowy/workspace/application/grid/field/field_listener.dart';
import 'package:app_flowy/workspace/application/grid/row/row_service.dart';
import 'package:flowy_sdk/log.dart';
@ -15,11 +15,11 @@ class DateCellBloc extends Bloc<DateCellEvent, DateCellState> {
final CellListener _cellListener;
final SingleFieldListener _fieldListener;
DateCellBloc({required CellData cellData})
DateCellBloc({required GridCellIdentifier cellIdentifier})
: _service = CellService(),
_cellListener = CellListener(rowId: cellData.rowId, fieldId: cellData.field.id),
_fieldListener = SingleFieldListener(fieldId: cellData.field.id),
super(DateCellState.initial(cellData)) {
_cellListener = CellListener(rowId: cellIdentifier.rowId, fieldId: cellIdentifier.field.id),
_fieldListener = SingleFieldListener(fieldId: cellIdentifier.field.id),
super(DateCellState.initial(cellIdentifier)) {
on<DateCellEvent>(
(event, emit) async {
event.map(
@ -106,13 +106,13 @@ class DateCellEvent with _$DateCellEvent {
@freezed
class DateCellState with _$DateCellState {
const factory DateCellState({
required CellData cellData,
required GridCellIdentifier cellData,
required String content,
required Field field,
DateTime? selectedDay,
}) = _DateCellState;
factory DateCellState.initial(CellData cellData) => DateCellState(
factory DateCellState.initial(GridCellIdentifier cellData) => DateCellState(
cellData: cellData,
field: cellData.field,
content: cellData.cell?.content ?? "",

View File

@ -1,4 +1,4 @@
import 'package:app_flowy/workspace/application/grid/cell_bloc/cell_listener.dart';
import 'package:app_flowy/workspace/application/grid/cell/cell_listener.dart';
import 'package:app_flowy/workspace/application/grid/field/field_listener.dart';
import 'package:app_flowy/workspace/application/grid/row/row_service.dart';
import 'package:flowy_sdk/log.dart';
@ -16,7 +16,7 @@ class NumberCellBloc extends Bloc<NumberCellEvent, NumberCellState> {
final SingleFieldListener _fieldListener;
NumberCellBloc({
required CellData cellData,
required GridCellIdentifier cellData,
}) : _service = CellService(),
_cellListener = CellListener(rowId: cellData.rowId, fieldId: cellData.field.id),
_fieldListener = SingleFieldListener(fieldId: cellData.field.id),
@ -105,11 +105,11 @@ class NumberCellEvent with _$NumberCellEvent {
@freezed
class NumberCellState with _$NumberCellState {
const factory NumberCellState({
required CellData cellData,
required GridCellIdentifier cellData,
required String content,
}) = _NumberCellState;
factory NumberCellState.initial(CellData cellData) {
factory NumberCellState.initial(GridCellIdentifier cellData) {
return NumberCellState(cellData: cellData, content: cellData.cell?.content ?? "");
}
}

View File

@ -1,5 +1,5 @@
import 'package:app_flowy/workspace/application/grid/cell_bloc/cell_listener.dart';
import 'package:app_flowy/workspace/application/grid/cell_bloc/select_option_service.dart';
import 'package:app_flowy/workspace/application/grid/cell/cell_listener.dart';
import 'package:app_flowy/workspace/application/grid/cell/select_option_service.dart';
import 'package:app_flowy/workspace/application/grid/field/field_listener.dart';
import 'package:app_flowy/workspace/application/grid/row/row_service.dart';
import 'package:flowy_sdk/log.dart';
@ -16,7 +16,7 @@ class SelectionCellBloc extends Bloc<SelectionCellEvent, SelectionCellState> {
final SingleFieldListener _fieldListener;
SelectionCellBloc({
required CellData cellData,
required GridCellIdentifier cellData,
}) : _service = SelectOptionService(),
_cellListener = CellListener(rowId: cellData.rowId, fieldId: cellData.field.id),
_fieldListener = SingleFieldListener(fieldId: cellData.field.id),
@ -93,12 +93,12 @@ class SelectionCellEvent with _$SelectionCellEvent {
@freezed
class SelectionCellState with _$SelectionCellState {
const factory SelectionCellState({
required CellData cellData,
required GridCellIdentifier cellData,
required List<SelectOption> options,
required List<SelectOption> selectedOptions,
}) = _SelectionCellState;
factory SelectionCellState.initial(CellData cellData) => SelectionCellState(
factory SelectionCellState.initial(GridCellIdentifier cellData) => SelectionCellState(
cellData: cellData,
options: [],
selectedOptions: [],

View File

@ -1,4 +1,4 @@
import 'package:app_flowy/workspace/application/grid/cell_bloc/cell_listener.dart';
import 'package:app_flowy/workspace/application/grid/cell/cell_listener.dart';
import 'package:app_flowy/workspace/application/grid/field/field_listener.dart';
import 'package:app_flowy/workspace/application/grid/row/row_service.dart';
import 'package:flowy_sdk/log.dart';
@ -18,7 +18,7 @@ class SelectOptionEditorBloc extends Bloc<SelectOptionEditorEvent, SelectOptionE
Timer? _delayOperation;
SelectOptionEditorBloc({
required CellData cellData,
required GridCellIdentifier cellData,
required List<SelectOption> options,
required List<SelectOption> selectedOptions,
}) : _selectOptionService = SelectOptionService(),
@ -174,7 +174,7 @@ class SelectOptionEditorState with _$SelectOptionEditorState {
}) = _SelectOptionEditorState;
factory SelectOptionEditorState.initial(
CellData cellData,
GridCellIdentifier cellData,
List<SelectOption> options,
List<SelectOption> selectedOptions,
) {

View File

@ -11,7 +11,7 @@ class TextCellBloc extends Bloc<TextCellEvent, TextCellState> {
TextCellBloc({
required this.service,
required CellData cellData,
required GridCellIdentifier cellData,
}) : super(TextCellState.initial(cellData)) {
on<TextCellEvent>(
(event, emit) async {
@ -53,7 +53,7 @@ class TextCellBloc extends Bloc<TextCellEvent, TextCellState> {
@freezed
class TextCellEvent with _$TextCellEvent {
const factory TextCellEvent.initial() = _InitialCell;
const factory TextCellEvent.didReceiveCellData(CellData cellData) = _DidReceiveCellData;
const factory TextCellEvent.didReceiveCellData(GridCellIdentifier cellData) = _DidReceiveCellData;
const factory TextCellEvent.updateText(String text) = _UpdateText;
}
@ -61,10 +61,10 @@ class TextCellEvent with _$TextCellEvent {
class TextCellState with _$TextCellState {
const factory TextCellState({
required String content,
required CellData cellData,
required GridCellIdentifier cellData,
}) = _TextCellState;
factory TextCellState.initial(CellData cellData) => TextCellState(
factory TextCellState.initial(GridCellIdentifier cellData) => TextCellState(
content: cellData.cell?.content ?? "",
cellData: cellData,
);

View File

@ -1,35 +0,0 @@
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:dartz/dartz.dart';
import 'package:flowy_sdk/dispatch/dispatch.dart';
import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-grid/cell_entities.pb.dart';
class CellService {
CellService();
Future<Either<void, FlowyError>> updateCell({
required String gridId,
required String fieldId,
required String rowId,
required String data,
}) {
final payload = CellChangeset.create()
..gridId = gridId
..fieldId = fieldId
..rowId = rowId
..data = data;
return GridEventUpdateCell(payload).send();
}
Future<Either<Cell, FlowyError>> getCell({
required String gridId,
required String fieldId,
required String rowId,
}) {
final payload = CellIdentifierPayload.create()
..gridId = gridId
..fieldId = fieldId
..rowId = rowId;
return GridEventGetCell(payload).send();
}
}

View File

@ -16,12 +16,12 @@ export 'field/type_option/number_bloc.dart';
export 'field/type_option/single_select_bloc.dart';
// Cell
export 'cell_bloc/text_cell_bloc.dart';
export 'cell_bloc/number_cell_bloc.dart';
export 'cell_bloc/selection_cell_bloc.dart';
export 'cell_bloc/date_cell_bloc.dart';
export 'cell_bloc/checkbox_cell_bloc.dart';
export 'cell_bloc/cell_service.dart';
export 'cell/text_cell_bloc.dart';
export 'cell/number_cell_bloc.dart';
export 'cell/selection_cell_bloc.dart';
export 'cell/date_cell_bloc.dart';
export 'cell/checkbox_cell_bloc.dart';
export 'cell/cell_service.dart';
// Setting
export 'setting/setting_bloc.dart';

View File

@ -12,7 +12,7 @@ import 'package:dartz/dartz.dart';
part 'row_bloc.freezed.dart';
typedef CellDataMap = LinkedHashMap<String, CellData>;
typedef CellDataMap = LinkedHashMap<String, GridCellIdentifier>;
class RowBloc extends Bloc<RowEvent, RowState> {
final RowService _rowService;
@ -111,7 +111,7 @@ class RowBloc extends Bloc<RowEvent, RowState> {
var map = CellDataMap.new();
for (final field in fields) {
if (field.visibility) {
map[field.id] = CellData(
map[field.id] = GridCellIdentifier(
rowId: row.id,
gridId: _rowService.gridId,
cell: row.cellByFieldId[field.id],

View File

@ -84,10 +84,10 @@ class RowsNotifier extends ChangeNotifier {
class GridRowCache {
final String gridId;
late GridRowListener _rowsListener;
final RowsNotifier _rowNotifier = RowsNotifier();
final HashMap<String, Row> _rowDataMap = HashMap();
UnmodifiableListView<Field> _fields = UnmodifiableListView([]);
final RowsNotifier _rowNotifier = RowsNotifier();
GridRowCache({required this.gridId}) {
_rowsListener = GridRowListener(gridId: gridId);
@ -216,8 +216,8 @@ class GridRowCache {
}
@freezed
class CellData with _$CellData {
const factory CellData({
class GridCellIdentifier with _$GridCellIdentifier {
const factory GridCellIdentifier({
required String gridId,
required String rowId,
required Field field,

View File

@ -7,7 +7,7 @@ import 'number_cell.dart';
import 'selection_cell/selection_cell.dart';
import 'text_cell.dart';
Widget buildGridCell(CellData cellData) {
Widget buildGridCell(GridCellIdentifier cellData) {
final key = ValueKey(cellData.field.id + cellData.rowId);
switch (cellData.field.fieldType) {
case FieldType.Checkbox:

View File

@ -6,7 +6,7 @@ import 'package:flutter/widgets.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
class CheckboxCell extends StatefulWidget {
final CellData cellData;
final GridCellIdentifier cellData;
const CheckboxCell({
required this.cellData,

View File

@ -9,7 +9,7 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:table_calendar/table_calendar.dart';
class DateCell extends GridCell {
final CellData cellData;
final GridCellIdentifier cellData;
const DateCell({
required this.cellData,

View File

@ -7,7 +7,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
class NumberCell extends GridCell {
final CellData cellData;
final GridCellIdentifier cellData;
const NumberCell({
required this.cellData,

View File

@ -8,7 +8,7 @@ import 'extension.dart';
import 'selection_editor.dart';
class SingleSelectCell extends GridCell {
final CellData cellData;
final GridCellIdentifier cellData;
const SingleSelectCell({
required this.cellData,
@ -64,7 +64,7 @@ class _SingleSelectCellState extends State<SingleSelectCell> {
//----------------------------------------------------------------
class MultiSelectCell extends GridCell {
final CellData cellData;
final GridCellIdentifier cellData;
const MultiSelectCell({
required this.cellData,

View File

@ -1,5 +1,5 @@
import 'dart:collection';
import 'package:app_flowy/workspace/application/grid/cell_bloc/selection_editor_bloc.dart';
import 'package:app_flowy/workspace/application/grid/cell/selection_editor_bloc.dart';
import 'package:app_flowy/workspace/application/grid/row/row_service.dart';
import 'package:app_flowy/workspace/presentation/plugins/grid/src/layout/sizes.dart';
import 'package:app_flowy/workspace/presentation/plugins/grid/src/widgets/header/type_option/edit_option_pannel.dart';
@ -25,7 +25,7 @@ import 'text_field.dart';
const double _editorPannelWidth = 300;
class SelectOptionCellEditor extends StatelessWidget with FlowyOverlayDelegate {
final CellData cellData;
final GridCellIdentifier cellData;
final List<SelectOption> options;
final List<SelectOption> selectedOptions;
final VoidCallback onDismissed;
@ -66,7 +66,7 @@ class SelectOptionCellEditor extends StatelessWidget with FlowyOverlayDelegate {
static void show(
BuildContext context,
CellData cellData,
GridCellIdentifier cellData,
List<SelectOption> options,
List<SelectOption> selectedOptions,
VoidCallback onDismissed,

View File

@ -6,7 +6,7 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'cell_container.dart';
class GridTextCell extends GridCell {
final CellData cellData;
final GridCellIdentifier cellData;
const GridTextCell({
required this.cellData,
Key? key,

View File

@ -4,7 +4,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
class NumberCell extends StatefulWidget {
final CellData cellData;
final GridCellIdentifier cellData;
const NumberCell({
required this.cellData,

View File

@ -4,7 +4,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
class NumberCell extends StatefulWidget {
final CellData cellData;
final GridCellIdentifier cellData;
const NumberCell({
required this.cellData,