【问题标题】:Flutter Riverpod disposing StreamController and using in HookWidgetFlutter Riverpod 配置 StreamController 并在 HookWidget 中使用
【发布时间】:2021-07-19 06:14:09
【问题描述】:

此实现代码是一个简单的Riverpod 提供程序,我们可以检测互联网连接:

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

Riverpod kook 怎么能在里面使用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>')

提前致谢

【问题讨论】:

  • @EdwynZN 你能帮我解决这个问题吗?谢谢

标签: flutter dart riverpod


【解决方案1】:

useProvider 的工作方式与ref.watch 相同,因此您只需要这样做:

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

【讨论】:

  • 非常感谢,请您帮我看看如何使用dispose 代替StreamController
  • 你在哪里使用控制器?我认为您可以简单地删除它。
  • 有入NetworkDetectorNotifier类:StreamController&lt;ConnectivityResult&gt; controller = StreamController&lt;ConnectivityResult&gt;();
  • 是的,但据我所知你没有使用它
  • 是的,你是对的,我的另一个问题呢? https://stackoverflow.com/q/68435432/1830228
猜你喜欢
  • 2022-07-17
  • 2019-03-18
  • 2021-05-03
  • 2021-03-17
  • 2021-01-22
  • 2021-03-19
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多