group_bloc.dart 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import 'package:flowy_sdk/protobuf/flowy-grid/field_entities.pb.dart';
  2. import 'package:flutter_bloc/flutter_bloc.dart';
  3. import 'package:freezed_annotation/freezed_annotation.dart';
  4. import 'dart:async';
  5. import '../field/field_controller.dart';
  6. import 'setting_service.dart';
  7. part 'group_bloc.freezed.dart';
  8. class GridGroupBloc extends Bloc<GridGroupEvent, GridGroupState> {
  9. final GridFieldController _fieldController;
  10. final SettingFFIService _settingFFIService;
  11. Function(List<GridFieldContext>)? _onFieldsFn;
  12. GridGroupBloc(
  13. {required String viewId, required GridFieldController fieldController})
  14. : _fieldController = fieldController,
  15. _settingFFIService = SettingFFIService(viewId: viewId),
  16. super(GridGroupState.initial(viewId, fieldController.fieldContexts)) {
  17. on<GridGroupEvent>(
  18. (event, emit) async {
  19. event.when(
  20. initial: () {
  21. _startListening();
  22. },
  23. didReceiveFieldUpdate: (fieldContexts) {
  24. emit(state.copyWith(fieldContexts: fieldContexts));
  25. },
  26. setGroupByField: (String fieldId, FieldType fieldType) {
  27. _settingFFIService.groupByField(
  28. fieldId: fieldId,
  29. fieldType: fieldType,
  30. );
  31. },
  32. );
  33. },
  34. );
  35. }
  36. @override
  37. Future<void> close() async {
  38. if (_onFieldsFn != null) {
  39. _fieldController.removeListener(onFieldsListener: _onFieldsFn!);
  40. _onFieldsFn = null;
  41. }
  42. return super.close();
  43. }
  44. void _startListening() {
  45. _onFieldsFn = (fieldContexts) =>
  46. add(GridGroupEvent.didReceiveFieldUpdate(fieldContexts));
  47. _fieldController.addListener(
  48. onFields: _onFieldsFn,
  49. listenWhen: () => !isClosed,
  50. );
  51. }
  52. }
  53. @freezed
  54. class GridGroupEvent with _$GridGroupEvent {
  55. const factory GridGroupEvent.initial() = _Initial;
  56. const factory GridGroupEvent.setGroupByField(
  57. String fieldId,
  58. FieldType fieldType,
  59. ) = _GroupByField;
  60. const factory GridGroupEvent.didReceiveFieldUpdate(
  61. List<GridFieldContext> fields) = _DidReceiveFieldUpdate;
  62. }
  63. @freezed
  64. class GridGroupState with _$GridGroupState {
  65. const factory GridGroupState({
  66. required String gridId,
  67. required List<GridFieldContext> fieldContexts,
  68. }) = _GridGroupState;
  69. factory GridGroupState.initial(
  70. String gridId, List<GridFieldContext> fieldContexts) =>
  71. GridGroupState(
  72. gridId: gridId,
  73. fieldContexts: fieldContexts,
  74. );
  75. }