Flutter类型赋值错误:BluetoothDevice?无法赋值给BluetoothDevice
解决Flutter中BluetoothDevice类型不匹配问题
这个错误是Dart空安全机制导致的——你右侧赋值的结果是可空的BluetoothDevice?类型,但左侧的device变量被声明为不可空的BluetoothDevice类型,两者无法直接赋值。以下是几种可行的解决方式:
方式一:将变量改为可空类型
直接把device的类型声明改成BluetoothDevice?,适配右侧可能为null的结果,这是最稳妥的方式:
// 先修改变量声明 BluetoothDevice? device; void initState() { super.initState(); flutterBlue.startScan(timeout: Duration(seconds: 4)); flutterBlue.scanResults.listen((results) { device = results.firstWhere((r) => r.device.name == 'Heart Rate', orElse: () => null)?.device; if (device != null) { flutterBlue.stopScan(); connectToDevice(); } }); }
方式二:用空断言强制转换(谨慎使用)
如果你能确保扫描结果里一定存在名为"Heart Rate"的设备,可以用!断言强制将可空类型转为非空类型,但如果实际没找到设备,会直接抛出异常:
void initState() { super.initState(); flutterBlue.startScan(timeout: Duration(seconds: 4)); flutterBlue.scanResults.listen((results) { // 用!断言,仅当确定设备一定存在时使用 device = results.firstWhere((r) => r.device.name == 'Heart Rate', orElse: () => null)!.device; if (device != null) { flutterBlue.stopScan(); connectToDevice(); } }); }
方式三:调整逻辑提前判空,避免可空赋值
先过滤出目标设备的扫描结果,确认非空后再赋值给不可空的device变量,既符合空安全规则,又不会有异常风险:
void initState() { super.initState(); flutterBlue.startScan(timeout: Duration(seconds: 4)); flutterBlue.scanResults.listen((results) { final targetResult = results.firstWhere( (r) => r.device.name == 'Heart Rate', orElse: () => null ); // 先确认找到结果,再赋值 if (targetResult != null) { device = targetResult.device; flutterBlue.stopScan(); connectToDevice(); } }); }
内容的提问来源于stack exchange,提问作者Nutdanai
相关产品推荐
相关产品推荐

