如何对FlutterBlue的Stream<List<ScanResult>>扫描结果进行过滤?
实现方法
你遇到的问题本质是混淆了Stream的.where和List的.where的作用范围:
- 直接对
Stream<List<ScanResult>>调用.where方法,过滤的是每次发射的整个列表对象,回调拿到的参数自然是List<ScanResult>类型 - 你需要的是对
Stream每次发射的列表内部元素做过滤,所以应该用Stream的.map方法,对每一次发射的列表单独做处理,再返回过滤后的列表即可。
示例代码:
StreamBuilder<List<ScanResult>>( stream: FlutterBlue.instance.scanResults // 转换每一次发射的扫描结果列表 .map((scanResultList) => scanResultList.where((element) { // 此处写入你的过滤规则,比如按设备名称、MAC地址过滤 // 示例:过滤设备名包含指定前缀的设备 return element.device.name.startsWith("TargetDevice"); }).toList()), // 剩余builder逻辑和原有实现完全一致 builder: (context, snapshot) { // 你的原有业务代码 } )
可选优化
如果你希望过滤后的列表为空时不触发StreamBuilder刷新,可以在.map之后追加.where过滤空列表:
.map(/* 上述过滤逻辑 */) .where((filteredList) => filteredList.isNotEmpty)
这样只有存在符合条件的扫描结果时才会更新UI,避免不必要的页面重建。
内容的提问来源于stack exchange,提问作者HuXu7
相关产品推荐
相关产品推荐

