diff --git a/packages/core/lib/utils/lifecycle/impl.dart b/packages/core/lib/utils/lifecycle/impl.dart index dbf4d06..9f63981 100644 --- a/packages/core/lib/utils/lifecycle/impl.dart +++ b/packages/core/lib/utils/lifecycle/impl.dart @@ -1 +1 @@ -export 'default.dart' if (dart.library.io) 'fgbg.dart'; +export 'default.dart' if (dart.library.io) 'widget_observer.dart'; diff --git a/packages/core/lib/utils/lifecycle/widget_observer.dart b/packages/core/lib/utils/lifecycle/widget_observer.dart new file mode 100644 index 0000000..c382d2e --- /dev/null +++ b/packages/core/lib/utils/lifecycle/widget_observer.dart @@ -0,0 +1,86 @@ +import 'dart:async'; +import 'package:flutter/widgets.dart'; + +enum AppStatus { foreground, background } + +abstract class LifeCycle extends Stream {} + +class LifeCycleImpl extends LifeCycle with WidgetsBindingObserver { + final StreamController _streamController = StreamController.broadcast(); + + LifeCycleImpl() { + WidgetsBinding.instance.addObserver(this); + } + + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + _streamController.add(state); + } + + @override + StreamSubscription listen(void Function(AppStatus event)? onData, {Function? onError, void Function()? onDone, bool? cancelOnError}) { + final subscription = _streamController.stream.listen((event) => event == AppLifecycleState.resumed ? AppStatus.foreground : AppStatus.background); + return _LifeCycleSuscription(subscription); + } +} + +class _LifeCycleSuscription extends StreamSubscription { + final StreamSubscription _subscription; + + _LifeCycleSuscription(this._subscription); + + @override + Future asFuture([E? futureValue]) { + return _subscription.asFuture(futureValue); + } + + @override + Future cancel() { + return _subscription.cancel(); + } + + @override + bool get isPaused => _subscription.isPaused; + + @override + void onData(void Function(AppStatus data)? handleData) { + _subscription.onData(handleData == null + ? null + : (data) { + if (data == AppLifecycleState.resumed) { + handleData(AppStatus.foreground); + } else if (data == AppLifecycleState.paused || data == AppLifecycleState.inactive) { + handleData(AppStatus.background); + } + }); + } + + @override + void onDone(void Function()? handleDone) { + _subscription.onData(handleDone == null + ? null + : (data) { + handleDone(); + }); + } + + @override + void onError(Function? handleError) { + _subscription.onData(handleError == null + ? null + : (error) { + handleError(error); + }); + } + + @override + void pause([Future? resumeSignal]) { + _subscription.pause(resumeSignal); + } + + @override + void resume() { + _subscription.resume(); + } +} + diff --git a/packages/core/pubspec.yaml b/packages/core/pubspec.yaml index 1fa9136..436beea 100644 --- a/packages/core/pubspec.yaml +++ b/packages/core/pubspec.yaml @@ -15,7 +15,6 @@ dependencies: plugin_platform_interface: ^2.0.2 uuid: ^3.0.7 json_annotation: ^4.8.0 - flutter_fgbg: ^0.2.2 state_notifier: ^0.7.2 http: ">=0.13.6 <2.0.0" logger: ^1.1.0