You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 15:07:08