diff --git a/flutter_client/lib/cache/connectivity_provider.dart b/flutter_client/lib/cache/connectivity_provider.dart index d3cf4d71..4e175661 100644 --- a/flutter_client/lib/cache/connectivity_provider.dart +++ b/flutter_client/lib/cache/connectivity_provider.dart @@ -5,9 +5,18 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; /// connectivity_plus reports the union (wifi, mobile, vpn, etc.) — operator /// chose "no Wi-Fi gate" for #357, so any connection means "go ahead and /// pull/cache". -final connectivityProvider = StreamProvider((ref) { +/// +/// IMPORTANT: onConnectivityChanged only emits on *changes*, not on +/// subscription. Without seeding an initial value via checkConnectivity(), +/// any consumer using `ref.read(connectivityProvider.future)` would +/// block until the OS happened to report a connectivity flip — which +/// is exactly what made album/artist/playlist detail screens spin +/// forever for tiles tapped before the first event landed. +final connectivityProvider = StreamProvider((ref) async* { final c = Connectivity(); - return c.onConnectivityChanged.map( - (results) => results.any((r) => r != ConnectivityResult.none), - ); + bool isOnline(List rs) => + rs.any((r) => r != ConnectivityResult.none); + + yield isOnline(await c.checkConnectivity()); + yield* c.onConnectivityChanged.map(isOnline); });