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( (cellData, _) => TextCellBloc(
service: CellService(), service: CellService(),
cellData: cellData, cellData: cellData,
), ),
); );
getIt.registerFactoryParam<SelectionCellBloc, CellData, void>( getIt.registerFactoryParam<SelectionCellBloc, GridCellIdentifier, void>(
(cellData, _) => SelectionCellBloc( (cellData, _) => SelectionCellBloc(
cellData: cellData, cellData: cellData,
), ),
); );
getIt.registerFactoryParam<NumberCellBloc, CellData, void>( getIt.registerFactoryParam<NumberCellBloc, GridCellIdentifier, void>(
(cellData, _) => NumberCellBloc( (cellData, _) => NumberCellBloc(
cellData: cellData, cellData: cellData,
), ),
); );
getIt.registerFactoryParam<DateCellBloc, CellData, void>( getIt.registerFactoryParam<DateCellBloc, GridCellIdentifier, void>(
(cellData, _) => DateCellBloc( (cellData, _) => DateCellBloc(
cellData: cellData, cellIdentifier: cellData,
), ),
); );
getIt.registerFactoryParam<CheckboxCellBloc, CellData, void>( getIt.registerFactoryParam<CheckboxCellBloc, GridCellIdentifier, void>(
(cellData, _) => CheckboxCellBloc( (cellData, _) => CheckboxCellBloc(
service: CellService(), service: CellService(),
cellData: cellData, 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:app_flowy/workspace/application/grid/row/row_service.dart';
import 'package:flowy_sdk/log.dart'; import 'package:flowy_sdk/log.dart';
import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart' show Cell; 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({ CheckboxCellBloc({
required CellService service, required CellService service,
required CellData cellData, required GridCellIdentifier cellData,
}) : _service = service, }) : _service = service,
_listener = CellListener(rowId: cellData.rowId, fieldId: cellData.field.id), _listener = CellListener(rowId: cellData.rowId, fieldId: cellData.field.id),
super(CheckboxCellState.initial(cellData)) { super(CheckboxCellState.initial(cellData)) {
@ -87,11 +87,11 @@ class CheckboxCellEvent with _$CheckboxCellEvent {
@freezed @freezed
class CheckboxCellState with _$CheckboxCellState { class CheckboxCellState with _$CheckboxCellState {
const factory CheckboxCellState({ const factory CheckboxCellState({
required CellData cellData, required GridCellIdentifier cellData,
required bool isSelected, required bool isSelected,
}) = _CheckboxCellState; }) = _CheckboxCellState;
factory CheckboxCellState.initial(CellData cellData) { factory CheckboxCellState.initial(GridCellIdentifier cellData) {
return CheckboxCellState(cellData: cellData, isSelected: _isSelected(cellData.cell)); 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/field/field_listener.dart';
import 'package:app_flowy/workspace/application/grid/row/row_service.dart'; import 'package:app_flowy/workspace/application/grid/row/row_service.dart';
import 'package:flowy_sdk/log.dart'; import 'package:flowy_sdk/log.dart';
@ -15,11 +15,11 @@ class DateCellBloc extends Bloc<DateCellEvent, DateCellState> {
final CellListener _cellListener; final CellListener _cellListener;
final SingleFieldListener _fieldListener; final SingleFieldListener _fieldListener;
DateCellBloc({required CellData cellData}) DateCellBloc({required GridCellIdentifier cellIdentifier})
: _service = CellService(), : _service = CellService(),
_cellListener = CellListener(rowId: cellData.rowId, fieldId: cellData.field.id), _cellListener = CellListener(rowId: cellIdentifier.rowId, fieldId: cellIdentifier.field.id),
_fieldListener = SingleFieldListener(fieldId: cellData.field.id), _fieldListener = SingleFieldListener(fieldId: cellIdentifier.field.id),
super(DateCellState.initial(cellData)) { super(DateCellState.initial(cellIdentifier)) {
on<DateCellEvent>( on<DateCellEvent>(
(event, emit) async { (event, emit) async {
event.map( event.map(
@ -106,13 +106,13 @@ class DateCellEvent with _$DateCellEvent {
@freezed @freezed
class DateCellState with _$DateCellState { class DateCellState with _$DateCellState {
const factory DateCellState({ const factory DateCellState({
required CellData cellData, required GridCellIdentifier cellData,
required String content, required String content,
required Field field, required Field field,
DateTime? selectedDay, DateTime? selectedDay,
}) = _DateCellState; }) = _DateCellState;
factory DateCellState.initial(CellData cellData) => DateCellState( factory DateCellState.initial(GridCellIdentifier cellData) => DateCellState(
cellData: cellData, cellData: cellData,
field: cellData.field, field: cellData.field,
content: cellData.cell?.content ?? "", 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/field/field_listener.dart';
import 'package:app_flowy/workspace/application/grid/row/row_service.dart'; import 'package:app_flowy/workspace/application/grid/row/row_service.dart';
import 'package:flowy_sdk/log.dart'; import 'package:flowy_sdk/log.dart';
@ -16,7 +16,7 @@ class NumberCellBloc extends Bloc<NumberCellEvent, NumberCellState> {
final SingleFieldListener _fieldListener; final SingleFieldListener _fieldListener;
NumberCellBloc({ NumberCellBloc({
required CellData cellData, required GridCellIdentifier cellData,
}) : _service = CellService(), }) : _service = CellService(),
_cellListener = CellListener(rowId: cellData.rowId, fieldId: cellData.field.id), _cellListener = CellListener(rowId: cellData.rowId, fieldId: cellData.field.id),
_fieldListener = SingleFieldListener(fieldId: cellData.field.id), _fieldListener = SingleFieldListener(fieldId: cellData.field.id),
@ -105,11 +105,11 @@ class NumberCellEvent with _$NumberCellEvent {
@freezed @freezed
class NumberCellState with _$NumberCellState { class NumberCellState with _$NumberCellState {
const factory NumberCellState({ const factory NumberCellState({
required CellData cellData, required GridCellIdentifier cellData,
required String content, required String content,
}) = _NumberCellState; }) = _NumberCellState;
factory NumberCellState.initial(CellData cellData) { factory NumberCellState.initial(GridCellIdentifier cellData) {
return NumberCellState(cellData: cellData, content: cellData.cell?.content ?? ""); 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/cell_listener.dart';
import 'package:app_flowy/workspace/application/grid/cell_bloc/select_option_service.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/field/field_listener.dart';
import 'package:app_flowy/workspace/application/grid/row/row_service.dart'; import 'package:app_flowy/workspace/application/grid/row/row_service.dart';
import 'package:flowy_sdk/log.dart'; import 'package:flowy_sdk/log.dart';
@ -16,7 +16,7 @@ class SelectionCellBloc extends Bloc<SelectionCellEvent, SelectionCellState> {
final SingleFieldListener _fieldListener; final SingleFieldListener _fieldListener;
SelectionCellBloc({ SelectionCellBloc({
required CellData cellData, required GridCellIdentifier cellData,
}) : _service = SelectOptionService(), }) : _service = SelectOptionService(),
_cellListener = CellListener(rowId: cellData.rowId, fieldId: cellData.field.id), _cellListener = CellListener(rowId: cellData.rowId, fieldId: cellData.field.id),
_fieldListener = SingleFieldListener(fieldId: cellData.field.id), _fieldListener = SingleFieldListener(fieldId: cellData.field.id),
@ -93,12 +93,12 @@ class SelectionCellEvent with _$SelectionCellEvent {
@freezed @freezed
class SelectionCellState with _$SelectionCellState { class SelectionCellState with _$SelectionCellState {
const factory SelectionCellState({ const factory SelectionCellState({
required CellData cellData, required GridCellIdentifier cellData,
required List<SelectOption> options, required List<SelectOption> options,
required List<SelectOption> selectedOptions, required List<SelectOption> selectedOptions,
}) = _SelectionCellState; }) = _SelectionCellState;
factory SelectionCellState.initial(CellData cellData) => SelectionCellState( factory SelectionCellState.initial(GridCellIdentifier cellData) => SelectionCellState(
cellData: cellData, cellData: cellData,
options: [], options: [],
selectedOptions: [], 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/field/field_listener.dart';
import 'package:app_flowy/workspace/application/grid/row/row_service.dart'; import 'package:app_flowy/workspace/application/grid/row/row_service.dart';
import 'package:flowy_sdk/log.dart'; import 'package:flowy_sdk/log.dart';
@ -18,7 +18,7 @@ class SelectOptionEditorBloc extends Bloc<SelectOptionEditorEvent, SelectOptionE
Timer? _delayOperation; Timer? _delayOperation;
SelectOptionEditorBloc({ SelectOptionEditorBloc({
required CellData cellData, required GridCellIdentifier cellData,
required List<SelectOption> options, required List<SelectOption> options,
required List<SelectOption> selectedOptions, required List<SelectOption> selectedOptions,
}) : _selectOptionService = SelectOptionService(), }) : _selectOptionService = SelectOptionService(),
@ -174,7 +174,7 @@ class SelectOptionEditorState with _$SelectOptionEditorState {
}) = _SelectOptionEditorState; }) = _SelectOptionEditorState;
factory SelectOptionEditorState.initial( factory SelectOptionEditorState.initial(
CellData cellData, GridCellIdentifier cellData,
List<SelectOption> options, List<SelectOption> options,
List<SelectOption> selectedOptions, List<SelectOption> selectedOptions,
) { ) {

View File

@ -11,7 +11,7 @@ class TextCellBloc extends Bloc<TextCellEvent, TextCellState> {
TextCellBloc({ TextCellBloc({
required this.service, required this.service,
required CellData cellData, required GridCellIdentifier cellData,
}) : super(TextCellState.initial(cellData)) { }) : super(TextCellState.initial(cellData)) {
on<TextCellEvent>( on<TextCellEvent>(
(event, emit) async { (event, emit) async {
@ -53,7 +53,7 @@ class TextCellBloc extends Bloc<TextCellEvent, TextCellState> {
@freezed @freezed
class TextCellEvent with _$TextCellEvent { class TextCellEvent with _$TextCellEvent {
const factory TextCellEvent.initial() = _InitialCell; 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; const factory TextCellEvent.updateText(String text) = _UpdateText;
} }
@ -61,10 +61,10 @@ class TextCellEvent with _$TextCellEvent {
class TextCellState with _$TextCellState { class TextCellState with _$TextCellState {
const factory TextCellState({ const factory TextCellState({
required String content, required String content,
required CellData cellData, required GridCellIdentifier cellData,
}) = _TextCellState; }) = _TextCellState;
factory TextCellState.initial(CellData cellData) => TextCellState( factory TextCellState.initial(GridCellIdentifier cellData) => TextCellState(
content: cellData.cell?.content ?? "", content: cellData.cell?.content ?? "",
cellData: cellData, 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'; export 'field/type_option/single_select_bloc.dart';
// Cell // Cell
export 'cell_bloc/text_cell_bloc.dart'; export 'cell/text_cell_bloc.dart';
export 'cell_bloc/number_cell_bloc.dart'; export 'cell/number_cell_bloc.dart';
export 'cell_bloc/selection_cell_bloc.dart'; export 'cell/selection_cell_bloc.dart';
export 'cell_bloc/date_cell_bloc.dart'; export 'cell/date_cell_bloc.dart';
export 'cell_bloc/checkbox_cell_bloc.dart'; export 'cell/checkbox_cell_bloc.dart';
export 'cell_bloc/cell_service.dart'; export 'cell/cell_service.dart';
// Setting // Setting
export 'setting/setting_bloc.dart'; export 'setting/setting_bloc.dart';

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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