import 'dart:async'; import 'package:meta/meta.dart'; import 'package:get/get.dart'; class Closeable{ @protected Future onClose()async{} @protected void listenStream(Stream stream, void Function(T event) onData){ _subscriptions.add(stream.listen(onData)); } @protected void listenRx(Rx rx, void Function(T event) onData){ _subscriptions.add(rx.listen(onData)); } @protected void addTimer(Duration interval, void Function() callback){ _timers.add(Timer.periodic(interval, (timer) { callback(); })); } @protected void rxBindRx({required Rx dst, required Rx src}){ dst.bindStream(src.stream); _rxList.add(dst); } void close(){ _isActive=false; for(final one in _subscriptions){ one.cancel(); } for(final one in _timers){ one.cancel(); } for(final one in _rxList){ one.close(); } onClose().then((value) => _closeController.close()); } Future join(){ _joinFuture??=()async{ try{ await for (final _ in _closeController.stream) {} }finally{} }(); return _joinFuture!; } final _closeController = StreamController(); Future? _joinFuture; var _isActive=true; bool get isActive=>_isActive; final List _timers = []; final _subscriptions = []; final _rxList = []; }