flutter使用flutter_ble_plus插件运用流的方式,显示蓝牙扫描结果页面

插件:flutter_blue_plus: ^1.28.13
蓝牙扫描类的封装:
如果对flutter的流(stream)不了解的可以去看看这个教学视频:streambuilder的使用

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_blue_plus/flutter_blue_plus.dart';

class BLE_Scanner {
  //创建一个controller控制流
  final _bleScanController = StreamController<ScanResult?>();
  
  Future<void> startBleScan() async {
    //把扫描结果添加到流里面
    FlutterBluePlus.scanResults.listen((event) {
      for (ScanResult element in event) {
        _bleScanController.add(element);
      }
    });
    await FlutterBluePlus.startScan(timeout: const Duration(seconds: 10));
  }
   //停止扫描接口
  Future<void> stopBleScan() async {
    await FlutterBluePlus.stopScan();
  }

  // 获取蓝牙扫描结果的 Stream,作为接口返回出去
  Stream<ScanResult?> get bleScanStream => _bleScanController.stream;
}

蓝牙扫描结果页面:

class bleScanTest extends StatefulWidget {
  const bleScanTest({super.key});

  
  State<bleScanTest> createState() => _bleScanTestState();
}

class _bleScanTestState extends State<bleScanTest> {
  final bleScanner = BLE_Scanner();
  List<ScanResult>? _scanResults;

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('蓝牙扫描流接收测试')),
      body: StreamBuilder<ScanResult?>(
        stream: bleScanner.bleScanStream,
        builder: (BuildContext context, AsyncSnapshot<ScanResult?> snapshot) {
          switch (snapshot.connectionState) {
            case ConnectionState.none:
              return const Text('没有数据流');
            case ConnectionState.active:
              if (snapshot.hasError) {
                return Text('Active: 错误: ${snapshot.error}');
              } else {
                _scanResults ??= [];
                 if (snapshot.data!.device.platformName.isNotEmpty) {
                _scanResults!.add(snapshot.data!);
                 }
                 print(_scanResults);
                return ListView.builder(
                  itemCount: _scanResults?.length,
                  itemBuilder: (BuildContext context, int index) {
                    final scanResult = _scanResults![index];
                    return ListTile(
                      title: Text('设备名称: ${scanResult.device.platformName}'),
                      subtitle: Text('设备ID: ${scanResult.device.remoteId}'),
                      onTap: (){
                        //连接逻辑,自己写
                      },
                    );
                  },
                );
              }
            case ConnectionState.waiting:
              return const Text('等待数据流');
            case ConnectionState.done:
              return const Text('数据流已经关闭');
          }
        },
      ),
      floatingActionButton: FloatingActionButton(onPressed: () async {
        if (_scanResults != null) {
          _scanResults!.clear();
        }
        bleScanner.startBleScan();
      }child: const Icon(Icons.bluetooth_searching)),
    );
  }
}
  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值