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

Flutter传递ScanResult至页面时出现Invalid Constant value错误求助

解决Flutter中传递ScanResult时的"Invalid constant value"错误

问题场景

开发BLE扫描器时,尝试将ScanResult通过页面跳转参数传递到Devicepage,触发了Invalid constant value.dart(invalid_constant)错误,相关代码如下:

ScanPage.dart 关键代码

flutterBlue.scanResults.listen((res) {
  if (!isFound) {
    for (ScanResult result in res) {
      if (result.device.id.toString() == "10:CE:A9:0C:7F:C4") {
        isFound = true;
        flutterBlue.stopScan();
        isRunning = false;
        Navigator.push(
            context,
            MaterialPageRoute(
                builder: (context) => const Devicepage(device: result))); // 错误触发位置
        return;
      }
    }
  }
});

Devicepage.dart 代码

class Devicepage extends StatelessWidget {
  final ScanResult device;
  const Devicepage({super.key, required this.device});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(device.device.name),
        centerTitle: true,
      ),
    );
  }
}

错误原因

你给Devicepage加了const修饰符,Flutter要求const构造函数的所有参数必须是编译时常量,但result是扫描过程中运行时动态获取的ScanResult实例,属于运行时变量,不符合const的要求,因此触发错误。

解决方法

直接去掉Devicepage前的const修饰符即可:

Navigator.push(
    context,
    MaterialPageRoute(
        builder: (context) => Devicepage(device: result))); // 移除const

额外优化建议

  1. 避免在build方法中调用runScan():build方法会在Widget重建时多次执行,会导致重复启动扫描,建议将runScan()移到initState()中,或者仅通过按钮点击触发:
@override
void initState() {
  super.initState();
  // 仅在页面初始化时执行一次扫描,或注释掉完全由按钮控制
  // runScan();
}
  1. 将isRunning改为State类成员变量:全局变量容易导致状态混乱,放到_HomePageState内部更安全:
class _HomePageState extends State<HomePage> {
  bool isRunning = false; // 移至此处
  // ... 其他代码
}
  1. 合理设置扫描超时:Duration(days:14)的超时设置过于夸张,建议改为合理时长,比如10秒:
flutterBlue.startScan(timeout: const Duration(seconds: 10));

内容的提问来源于stack exchange,提问作者Andris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 17:32:48