如何在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
相关产品推荐
相关产品推荐

