40 lines
1.2 KiB
Dart
40 lines
1.2 KiB
Dart
import 'dart:async';
|
||
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
|
||
|
||
class BluetoothHelper {
|
||
static StreamSubscription<BluetoothAdapterState>? _subscription;
|
||
|
||
/// 获取当前蓝牙是否开启(跨平台封装)
|
||
static Future<bool> isBluetoothOn({Duration timeout = const Duration(seconds: 2)}) async {
|
||
// 先尝试直接获取(Android 上几乎即时可用)
|
||
bool directCheck = await FlutterBluePlus.isOn;
|
||
if (directCheck) return true;
|
||
|
||
// iOS 上有初始化延迟,用 adapterState.first 再确认一次
|
||
try {
|
||
BluetoothAdapterState state = await FlutterBluePlus.adapterState
|
||
.firstWhere((s) => s != BluetoothAdapterState.unknown,
|
||
orElse: () => BluetoothAdapterState.unknown)
|
||
.timeout(timeout);
|
||
|
||
return state == BluetoothAdapterState.on;
|
||
} catch (_) {
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/// 监听蓝牙状态变化
|
||
static void listenBluetoothState(void Function(bool isOn) onChange) {
|
||
_subscription?.cancel();
|
||
_subscription = FlutterBluePlus.adapterState.listen((state) {
|
||
onChange(state == BluetoothAdapterState.on);
|
||
});
|
||
}
|
||
|
||
/// 停止监听
|
||
static void cancelListener() {
|
||
_subscription?.cancel();
|
||
_subscription = null;
|
||
}
|
||
}
|