DolDurma
DolDurma

Reputation: 17303

Flutter Riverpod disposing StreamController and using in HookWidget

This implementation code is a simple Riverpod provider which we can detect internet connection:

enum NetworkStatus { NotDetermined, On, Off }

final networkAwareProvider = StateNotifierProvider((ref)=>NetworkDetectorNotifier());

class NetworkDetectorNotifier extends StateNotifier<NetworkStatus> {
  StreamController<ConnectivityResult> controller =
  StreamController<ConnectivityResult>();

  NetworkStatus lastResult = NetworkStatus.NotDetermined;

  NetworkDetectorNotifier() : super(NetworkStatus.NotDetermined) {

    Connectivity().onConnectivityChanged.listen((ConnectivityResult result) {
      NetworkStatus newState;
      switch (result) {
        case ConnectivityResult.mobile:
        case ConnectivityResult.wifi:
          newState = NetworkStatus.On;
          break;
        case ConnectivityResult.none:
          newState = NetworkStatus.Off;
          break;
      }

      if (newState != state) {
        state = newState;
      }
    });
  }
}

here how can i dispose controller and basically when we want to use that inside ConsumerWidget we can have:

class Screen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Consumer(builder: (context, watch, child) {
      var network = watch(networkAwareProvider).state;
      if (network == NetworkStatus.Off) {
        return Center(child: Text("No network"));
      }

      return Container(child: Text("Normal stuff"));
    });
  }
}

with Riverpod kook how can use whatch method in it? for example:

class Profile extends HookWidget {
  @override
  Widget build(BuildContext context) {
    final _network = useProvider(networkAwareProvider);
    final connected = _network.watch(networkAwareProvider).state;
    if(connected){
      print ('connected');
    }else{
      print ('not connected');
    }
 }
}

i get this error:

Class 'NetworkStatus' has no instance method 'watch'.
Receiver: Instance of 'NetworkStatus'
Tried calling: watch(Instance of 'StateNotifierProvider<NetworkDetectorNotifier, dynamic>')

thanks in advance

Upvotes: 0

Views: 1234

Answers (1)

Martyns
Martyns

Reputation: 3875

useProvider works the same way as ref.watch, so you would just need to do:

final status = useProvider(networkAwareProvider);
if (status == ...) {
  ...
}

Upvotes: 1

Related Questions