Flutter颜色管理插件simpleblue的使用
Flutter颜色管理插件simpleblue的使用
特性
- 支持Android和iOS。
- 代码量小,因此底层系统(例如蓝牙相关更新)的更改可以轻松升级。
- 使用简单,只需几个函数即可创建一个功能完备的应用。
Android
在AndroidManifest.xml
文件中添加以下权限。您可以使用permission_handler
包来处理权限。
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:maxSdkVersion="28" />
iOS
在Xcode的Info.plist
文件中添加以下属性:
- Privacy - Bluetooth Always Usage Description
- Privacy - Bluetooth Peripheral Usage Description
使用示例
以下是一个完整的示例代码,展示了如何使用simpleblue
插件进行蓝牙设备的扫描和连接。
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:simpleblue/model/bluetooth_device.dart';
import 'package:simpleblue/simpleblue.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({Key? key}) : super(key: key);
[@override](/user/override)
State<MyApp> createState() => _MyAppState();
}
const serviceUUID = null;
const scanTimeout = 15000;
class _MyAppState extends State<MyApp> {
final _simplebluePlugin = Simpleblue();
bool _isBluetoothTurnedOn = false;
var devices = <String, BluetoothDevice>{};
String receivedData = '';
[@override](/user/override)
void initState() {
super.initState();
_simplebluePlugin.listenConnectedDevice().listen((connectedDevice) {
debugPrint("Connected device: $connectedDevice");
if (connectedDevice != null) {
setState(() {
devices[connectedDevice.uuid] = connectedDevice;
});
}
connectedDevice?.stream?.listen((received) {
setState(() {
receivedData += "${DateTime.now().toString()}: $received\n";
});
});
}).onError((err) {
debugPrint(err);
});
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
scan();
});
_simplebluePlugin.getDevices().then((value) => setState(() {
for (var device in value) {
devices[device.uuid] = device;
}
}));
_simplebluePlugin.isTurnedOn().then((value) => setState(() {
_isBluetoothTurnedOn = value ?? false;
}));
_simplebluePlugin.listenStateChanges().listen((state) {
debugPrint('Bluetooth state changed to: $state');
setState(() {
_isBluetoothTurnedOn = state == SimpleblueState.on;
});
});
}
void scan() async {
final isBluetoothGranted = Platform.isIOS ||
(await Permission.bluetoothScan.status) == PermissionStatus.granted ||
(await Permission.bluetoothScan.request()) == PermissionStatus.granted;
if (isBluetoothGranted) {
print("Bluetooth permission granted");
final isLocationGranted = Platform.isIOS ||
(await Permission.location.status) == PermissionStatus.granted ||
(await Permission.location.request()) == PermissionStatus.granted;
if (isLocationGranted) {
print("Location permission granted");
_simplebluePlugin
.scanDevices(serviceUUID: serviceUUID, timeout: scanTimeout)
.listen((event) {
setState(() {
for (var device in event) {
devices[device.uuid] = device;
}
});
});
}
}
}
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Plugin example app'),
),
body: Column(children: [
if (_isBluetoothTurnedOn)
TextButton(
child: Text('关闭蓝牙'),
onPressed: () {
_simplebluePlugin.turnOff();
}),
if (!_isBluetoothTurnedOn)
TextButton(
child: Text('打开蓝牙'),
onPressed: () {
_simplebluePlugin.turnOn();
}),
TextButton(
child: Text('获取设备'),
onPressed: () {
_simplebluePlugin.getDevices().then((value) {
setState(() {
for (var device in value) {
devices[device.uuid] = device;
}
});
});
}),
TextButton(
child: Text('扫描设备'),
onPressed: () {
scan();
}),
Expanded(
child: buildDevices(),
),
SizedBox(
height: 200,
child: Align(
alignment: Alignment.topLeft,
child: Text(
receivedData,
style: const TextStyle(fontSize: 10),
)))
]),
),
);
}
final _connectingUUIDs = <String>[];
Widget buildDevices() {
final devList = devices.values.toList();
return ListView.builder(
itemCount: devList.length,
itemBuilder: (context, index) {
final device = devList[index];
return ListTile(
onTap: () {
if (device.isConnected) {
_simplebluePlugin.disconnect(device.uuid);
} else {
setState(() {
_connectingUUIDs.add(device.uuid);
});
_simplebluePlugin.connect(device.uuid).then((value) {
setState(() {
_connectingUUIDs.remove(device.uuid);
});
});
}
},
leading: _connectingUUIDs.contains(device.uuid)
? Icon(Icons.bluetooth, color: Colors.orange)
: (device.isConnected
? Icon(Icons.bluetooth_connected, color: Colors.blue)
: Icon(
Icons.bluetooth,
color: Colors.grey.shade300,
)),
title: Text('${device.name ?? '无名称'}\n${device.uuid}'),
subtitle: device.isConnected
? Row(
children: [
TextButton(
child: Text('写入数据1'),
onPressed: () {
_simplebluePlugin.write(
device.uuid, "样本数据".codeUnits);
}),
TextButton(
child: Text('写入数据2'),
onPressed: () {
_simplebluePlugin.write(
device.uuid, "样本数据2".codeUnits);
})
],
)
: null,
);
});
}
}
更多关于Flutter颜色管理插件simpleblue的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复