Reputation: 1743
I have this class to expose the state of my internet connection using connectivity_plus
:
enum InternetConnectionStatus {
connected,
disconnected,
}
@riverpod
class ConnectionStatus extends _$ConnectionStatus {
@override
Option<InternetConnectionStatus> build() => None();
void update(List<ConnectivityResult> connectionStatus) {
debugPrint("new internet connection: $connectionStatus");
state = connectionStatus.any((status) => [
ConnectivityResult.mobile.name,
ConnectivityResult.wifi.name
].contains(status.name))
? Some(InternetConnectionStatus.connected)
: Some(InternetConnectionStatus.disconnected);
}
}
And somewhere else I am updating the state using
Future<void> _updateConnectionStatus(List<ConnectivityResult> result) async {
debugPrint("updateConnectionStatus: $result");
setState(() {
_connectionStatus = result;
});
ref.read(connectionStatusProvider.notifier).update(result);
}
And I listen to the new state using:
final status = ref.watch(connectionStatusProvider);
debugPrint("internet connection: $status");
This is what I get printed out:
I new internet connection: [ConnectivityResult.wifi]
I internet connection: None
I expect to get: internet connection: Some(InternetConnectionStatus.connected) when I call the update()
method with either wifi or mobile.
As a workaround I am using setState
to update the connection status since connectionStatusProvider
is not working as intended.
@override
void initState() {
super.initState();
_initConnectivity();
_connectivitySubscription =
_connectivity.onConnectivityChanged.listen(_updateConnectionStatus);
}
After more digging it seems like the build()
method in ConnectionStatus
class is getting calles every time. I change the default value and it is what i get everytime.
Upvotes: 0
Views: 79