You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Riverpod中用select方法监听枚举值,仅触发WiFi状态重建

问题

希望通过Riverpod的select方法监听ConnectivityResult枚举值变化,仅当枚举值为wifi时触发repoProvider重建。现有代码如下:

enum ConnectivityResult {
  bluetooth,  
  wifi,
  ethernet,
  mobile,
  none
}
    

final connectivityProvider = StreamProvider<ConnectivityResult>((ref){
    // 省略流逻辑
})

final repoProvider = FutureProvider<List>((ref) async {
  ref.watch(
    connectivityProvider.selectAsync(
      // 此处需实现回调逻辑
      (data) => ConnectivityResult.wifi,
    ),
  );
  // 省略数据获取逻辑
});

请问应编写怎样的回调逻辑来实现该需求?

解决方案

方法1:仅在切换为wifi时触发重建

如果需要只有当连接状态从非wifi切换为wifi时才触发repoProvider重建,可以通过返回一个固定标识来标记非wifi状态:

首先定义一个私有标识类(用于区分非wifi状态,避免重复创建对象):

class _NonWifiMarker {
  const _NonWifiMarker();
}

然后修改selectAsync的回调:

final repoProvider = FutureProvider<List>((ref) async {
  ref.watch(
    connectivityProvider.selectAsync(
      (data) => data == ConnectivityResult.wifi 
          ? data 
          : const _NonWifiMarker(),
    ),
  );
  // 数据获取逻辑
});
  • 非wifi状态下,始终返回同一个_NonWifiMarker实例,即使状态在蓝牙、移动网络之间切换,返回值的引用不变,Riverpod不会触发重建。
  • 当状态切换为wifi时,返回值从_NonWifiMarker变为ConnectivityResult.wifi,值发生变化,触发repoProvider重建。
  • 若不希望从wifi切换为非wifi时触发重建,可在repoProvider内判断当前状态,仅在wifi时执行数据逻辑。

方法2:wifi状态变化时触发重建

如果允许连接状态在wifi和非wifi之间切换时都触发重建,但仅在wifi状态下执行数据逻辑,可直接返回布尔值:

final repoProvider = FutureProvider<List>((ref) async {
  final isWifi = ref.watch(
    connectivityProvider.selectAsync(
      (data) => data == ConnectivityResult.wifi,
    ),
  );
  
  // 仅在wifi状态下执行数据获取
  if (!isWifi) {
    return []; // 返回默认空数据或其他占位内容
  }
  
  // 此处编写wifi状态下的数据获取逻辑
});
  • 当连接状态在wifi和非wifi之间切换时,布尔值isWifi会变化,触发repoProvider重建,但只有wifi状态下才会执行实际的数据逻辑。

内容的提问来源于stack exchange,提问作者Thet Lwin Lwin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 12:30:53