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

如何对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 16:54:02