import 'dart:async'; import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:flutter/widgets.dart'; import '../session/session.dart'; /// 监听网络切换与应用恢复,触发 IM 极速重连。 class ImLifecycle with WidgetsBindingObserver { ImLifecycle(this.session); final SessionStore session; StreamSubscription>? _netSub; List _lastNet = const []; void start() { WidgetsBinding.instance.addObserver(this); _netSub = Connectivity().onConnectivityChanged.listen(_onNet); Connectivity().checkConnectivity().then((r) => _lastNet = r); } void stop() { WidgetsBinding.instance.removeObserver(this); _netSub?.cancel(); _netSub = null; } void _onNet(List next) { final wasOffline = _lastNet.every((e) => e == ConnectivityResult.none); final nowOnline = next.any((e) => e != ConnectivityResult.none); _lastNet = next; if (wasOffline && nowOnline && session.signedIn) { unawaited(session.connectIm(force: true)); } } @override void didChangeAppLifecycleState(AppLifecycleState state) { if (state == AppLifecycleState.resumed && session.signedIn) { unawaited(session.connectIm(force: true)); } } }