diff --git a/lib/components/connect_button.dart b/lib/components/connect_button.dart index 2e739ee..60227d2 100644 --- a/lib/components/connect_button.dart +++ b/lib/components/connect_button.dart @@ -19,6 +19,7 @@ class _ConnectButtonState extends State DateTime _lastTap = DateTime.fromMillisecondsSinceEpoch(0); AnimationController? _pulse; Animation? _pulseAnim; + VpnConnection? _vpn; double get _pulseValue => _pulseAnim?.value ?? 0.0; @@ -35,20 +36,25 @@ class _ConnectButtonState extends State ); WidgetsBinding.instance.addObserver(this); WidgetsBinding.instance.addPostFrameCallback((_) { - if (mounted) context.read().addListener(_onVpnChanged); + if (!mounted || _vpn != null) return; + final vpn = context.read(); + _vpn = vpn; + vpn.addListener(_onVpnChanged); + _onVpnChanged(); }); } @override void dispose() { WidgetsBinding.instance.removeObserver(this); - context.read().removeListener(_onVpnChanged); + _vpn?.removeListener(_onVpnChanged); _pulse?.dispose(); super.dispose(); } void _onVpnChanged() { - final vpn = context.read(); + final vpn = _vpn; + if (vpn == null) return; if (vpn.status == VpnStatus.connected) { _pulse?.repeat(reverse: true); } else { @@ -60,14 +66,12 @@ class _ConnectButtonState extends State @override void didChangeAppLifecycleState(AppLifecycleState state) { if (!mounted) return; - if (state == AppLifecycleState.paused || - state == AppLifecycleState.detached) { + if (state != AppLifecycleState.resumed) { _pulse?.stop(); - } else if (state == AppLifecycleState.resumed) { - final vpn = context.read(); - if (vpn.status == VpnStatus.connected) { - _pulse?.repeat(reverse: true); - } + return; + } + if (_vpn?.status == VpnStatus.connected) { + _pulse?.repeat(reverse: true); } }