DeKekem
DeKekem

Reputation: 1743

Riverpod state not being updated

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

Answers (0)

Related Questions