From 4ac7824babf3b1e7b1905b3fe87eb1ec46e81dac Mon Sep 17 00:00:00 2001 From: BreX900 Date: Mon, 2 May 2022 17:15:25 +0200 Subject: [PATCH] feat realtime position stream --- .../lib/src/blocs/position_bloc.dart | 17 ++++++++++ kuama_position/test/position_bloc_test.dart | 32 +++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/kuama_position/lib/src/blocs/position_bloc.dart b/kuama_position/lib/src/blocs/position_bloc.dart index adb70e9..4022747 100644 --- a/kuama_position/lib/src/blocs/position_bloc.dart +++ b/kuama_position/lib/src/blocs/position_bloc.dart @@ -52,6 +52,23 @@ class PositionBloc extends Bloc<_PositionBlocEvent, PositionBlocState> { /// There is no need to call it if you weren't listening to the realtime position. void unTrack() => add(const _UnTrackPositionBloc()); + /// !!! WARNING !!! It is not stable. It could get breakages + late Stream onRealtimePositionChanges = _createRealtimePositionStream(); + + Stream _createRealtimePositionStream() { + return Stream.multi((controller) { + final subscription = stream.listen((state) { + if (state is PositionBlocLocated) controller.addSync(state.currentPosition); + }); + track(); + controller.onCancel = () async { + unTrack(); + await subscription.cancel(); + controller.closeSync(); + }; + }); + } + Future _mapEventToState(_PositionBlocEvent event, Emitter emit) async { return event.map>(updateStatus: (event) { return _mapStatusUpdate(emit, event.hasPermissionGranted, event.isServiceEnabled); diff --git a/kuama_position/test/position_bloc_test.dart b/kuama_position/test/position_bloc_test.dart index 891f438..be5e017 100644 --- a/kuama_position/test/position_bloc_test.dart +++ b/kuama_position/test/position_bloc_test.dart @@ -352,4 +352,36 @@ void main() { await bloc.close(); }); }); + + // TODO: Test realtimePosition method + // group('realtimePosition', () { + // test('1', () async { + // init(permission: EmissionType.alreadyHas, service: EmissionType.alreadyHas); + // bloc.emit(const PositionBlocIdle( + // lastPosition: null, + // hasPermission: true, + // isServiceEnabled: true, + // )); + // + // when(() => mockPositionService.getCurrentPosition()).thenAnswer((_) async { + // return const GeoPoint(0.0, 0.0); + // }); + // when(() => mockPositionService.onPositionChanges).thenAnswer((_) async* { + // yield const GeoPoint(0.0, 0.0); + // }); + // + // final sub1 = bloc.onRealtimePositionChanges.listen((event) { + // print('Listen'); + // }); + // + // final sub2 = bloc.onRealtimePositionChanges.listen((event) { + // print('Listen'); + // }); + // + // await Future.delayed(const Duration(seconds: 1), () { + // // sub1.cancel(); + // sub2.cancel(); + // }); + // }); + // }); }