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

