flutter如何实现蓝牙连接demo
最近在学习Flutter开发,想实现一个蓝牙连接的Demo,但不太清楚具体步骤。有没有完整的示例代码可以参考?需要用到哪些插件?在Android和iOS平台上的实现有什么区别吗?调试过程中应该注意哪些常见问题?
2 回复
使用Flutter实现蓝牙连接,步骤如下:
- 添加依赖:
flutter_blue_plus。 - 检查设备蓝牙状态并请求权限。
- 扫描附近设备并获取列表。
- 选择设备并建立连接。
- 发现服务并读写特征值。
示例代码可参考官方文档或GitHub示例。
更多关于flutter如何实现蓝牙连接demo的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中实现蓝牙连接需要使用flutter_blue_plus插件,以下是完整的蓝牙连接Demo:
1. 添加依赖
在 pubspec.yaml 中添加:
dependencies:
flutter_blue_plus: ^1.10.0
2. 权限配置
Android (android/app/src/main/AndroidManifest.xml):
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
iOS (ios/Runner/Info.plist):
<dict>
<key>NSBluetoothAlwaysUsageDescription</key>
<string>需要蓝牙权限来连接设备</string>
</dict>
3. 完整示例代码
import 'package:flutter/material.dart';
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
class BluetoothDemo extends StatefulWidget {
@override
_BluetoothDemoState createState() => _BluetoothDemoState();
}
class _BluetoothDemoState extends State<BluetoothDemo> {
List<BluetoothDevice> devices = [];
BluetoothDevice? connectedDevice;
bool isScanning = false;
@override
void initState() {
super.initState();
_checkPermissions();
}
// 检查权限
Future<void> _checkPermissions() async {
await FlutterBluePlus.turnOn();
}
// 开始扫描
void _startScan() {
setState(() {
devices.clear();
isScanning = true;
});
FlutterBluePlus.scanResults.listen((results) {
for (ScanResult result in results) {
if (!devices.contains(result.device)) {
setState(() {
devices.add(result.device);
});
}
}
});
FlutterBluePlus.startScan(timeout: Duration(seconds: 10));
}
// 停止扫描
void _stopScan() {
FlutterBluePlus.stopScan();
setState(() {
isScanning = false;
});
}
// 连接设备
Future<void> _connectToDevice(BluetoothDevice device) async {
try {
await device.connect();
setState(() {
connectedDevice = device;
});
print('已连接到: ${device.name}');
} catch (e) {
print('连接失败: $e');
}
}
// 断开连接
Future<void> _disconnectDevice() async {
if (connectedDevice != null) {
await connectedDevice!.disconnect();
setState(() {
connectedDevice = null;
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('蓝牙连接Demo'),
actions: [
IconButton(
icon: Icon(isScanning ? Icons.stop : Icons.search),
onPressed: isScanning ? _stopScan : _startScan,
),
],
),
body: Column(
children: [
// 连接状态
ListTile(
title: Text('连接状态'),
subtitle: Text(connectedDevice?.name ?? '未连接'),
trailing: connectedDevice != null
? ElevatedButton(
onPressed: _disconnectDevice,
child: Text('断开'),
)
: null,
),
// 设备列表
Expanded(
child: ListView.builder(
itemCount: devices.length,
itemBuilder: (context, index) {
final device = devices[index];
return ListTile(
title: Text(device.name.isEmpty ? '未知设备' : device.name),
subtitle: Text(device.remoteId.toString()),
trailing: ElevatedButton(
onPressed: () => _connectToDevice(device),
child: Text('连接'),
),
);
},
),
),
],
),
);
}
}
4. 主要功能说明
- 扫描设备: 调用
startScan()开始扫描周边蓝牙设备 - 显示设备: 通过
scanResults监听器获取扫描结果 - 连接设备: 使用
device.connect()建立连接 - 断开连接: 使用
device.disconnect()断开连接
5. 注意事项
- 需要在实际设备上测试,模拟器不支持蓝牙
- iOS需要真实设备且需要配置蓝牙权限描述
- Android 12+需要额外处理新的蓝牙权限
这个Demo提供了基础的蓝牙扫描和连接功能,你可以根据需要扩展数据读写等高级功能。

