row_bloc.dart 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import 'dart:collection';
  2. import 'package:app_flowy/plugins/grid/application/cell/cell_service/cell_service.dart';
  3. import 'package:app_flowy/plugins/grid/application/field/field_controller.dart';
  4. import 'package:equatable/equatable.dart';
  5. import 'package:flutter_bloc/flutter_bloc.dart';
  6. import 'package:freezed_annotation/freezed_annotation.dart';
  7. import 'dart:async';
  8. import 'row_cache.dart';
  9. import 'row_data_controller.dart';
  10. import 'row_service.dart';
  11. part 'row_bloc.freezed.dart';
  12. class RowBloc extends Bloc<RowEvent, RowState> {
  13. final RowFFIService _rowService;
  14. final RowDataController _dataController;
  15. RowBloc({
  16. required RowInfo rowInfo,
  17. required RowDataController dataController,
  18. }) : _rowService = RowFFIService(gridId: rowInfo.gridId),
  19. _dataController = dataController,
  20. super(RowState.initial(rowInfo, dataController.loadData())) {
  21. on<RowEvent>(
  22. (event, emit) async {
  23. await event.map(
  24. initial: (_InitialRow value) async {
  25. await _startListening();
  26. },
  27. createRow: (_CreateRow value) {
  28. _rowService.createRow(rowInfo.rowPB.id);
  29. },
  30. didReceiveCells: (_DidReceiveCells value) async {
  31. final cells = value.gridCellMap.values
  32. .map((e) => GridCellEquatable(e.fieldInfo))
  33. .toList();
  34. emit(state.copyWith(
  35. gridCellMap: value.gridCellMap,
  36. cells: UnmodifiableListView(cells),
  37. changeReason: value.reason,
  38. ));
  39. },
  40. );
  41. },
  42. );
  43. }
  44. @override
  45. Future<void> close() async {
  46. _dataController.dispose();
  47. return super.close();
  48. }
  49. Future<void> _startListening() async {
  50. _dataController.addListener(
  51. onRowChanged: (cells, reason) {
  52. if (!isClosed) {
  53. add(RowEvent.didReceiveCells(cells, reason));
  54. }
  55. },
  56. );
  57. }
  58. }
  59. @freezed
  60. class RowEvent with _$RowEvent {
  61. const factory RowEvent.initial() = _InitialRow;
  62. const factory RowEvent.createRow() = _CreateRow;
  63. const factory RowEvent.didReceiveCells(
  64. GridCellMap gridCellMap, RowsChangedReason reason) = _DidReceiveCells;
  65. }
  66. @freezed
  67. class RowState with _$RowState {
  68. const factory RowState({
  69. required RowInfo rowInfo,
  70. required GridCellMap gridCellMap,
  71. required UnmodifiableListView<GridCellEquatable> cells,
  72. RowsChangedReason? changeReason,
  73. }) = _RowState;
  74. factory RowState.initial(RowInfo rowInfo, GridCellMap cellDataMap) =>
  75. RowState(
  76. rowInfo: rowInfo,
  77. gridCellMap: cellDataMap,
  78. cells: UnmodifiableListView(
  79. cellDataMap.values
  80. .map((e) => GridCellEquatable(e.fieldInfo))
  81. .toList(),
  82. ),
  83. );
  84. }
  85. class GridCellEquatable extends Equatable {
  86. final FieldInfo _fieldContext;
  87. const GridCellEquatable(FieldInfo field) : _fieldContext = field;
  88. @override
  89. List<Object?> get props => [
  90. _fieldContext.id,
  91. _fieldContext.fieldType,
  92. _fieldContext.visibility,
  93. _fieldContext.width,
  94. ];
  95. }