代码之家  ›  专栏  ›  技术社区  ›  DolDurma

颤振控制器及其在船舶上的应用

  •  0
  • DolDurma  · 技术社区  · 4 年前

    此实现代码是一个简单的 Riverpod 我们可以检测internet连接的提供商:

    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;
          }
        });
      }
    }
    

    这里我怎么处理 controller ConsumerWidget 我们可以:

    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"));
        });
      }
    }
    

    具有 whatch 方法在里面?例如:

    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');
        }
     }
    }
    

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

    提前谢谢

    0 回复  |  直到 4 年前
        1
  •  1
  •   Martyns Harshit    4 年前

    useProvider 工作原理与 ref.watch ,因此您只需执行以下操作:

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