Flutter中onGenerateRoute报“Invalid Constant Value”错误的解决方法
Flutter中onGenerateRoute报“Invalid Constant Value”错误的解决方法
最近在实现Flutter深层链接(Deeplinking)的时候,我碰到了onGenerateRoute报「Invalid Constant Value」的错误,折腾了好一会儿才发现问题根源在Main.dart里的MultiProvider使用上,下面给大家分享我的解决思路和方案:
问题原因
这个错误本质上是常量上下文里使用了非常量表达式导致的。当时我为了优化性能给MaterialApp加了const修饰符,但onGenerateRoute的路由生成逻辑里需要依赖MultiProvider提供的状态或者直接嵌套了MultiProvider,而MultiProvider是无法被标记为常量的,这就触发了「Invalid Constant Value」错误。
解决步骤
去掉
MaterialApp的const修饰符
如果你的MaterialApp是用const声明的,直接去掉这个关键字就行。比如原来的错误代码:const MaterialApp( onGenerateRoute: (settings) { return MaterialPageRoute( builder: (context) => MultiProvider( providers: [/* 你的provider配置 */], child: TargetScreen(), ), ); }, );修正后:
MaterialApp( onGenerateRoute: (settings) { return MaterialPageRoute( builder: (context) => MultiProvider( providers: [/* 你的provider配置 */], child: TargetScreen(), ), ); }, );避免在路由构造时直接引用非常量依赖
如果你的目标页面需要使用MultiProvider中的数据,不要在路由的常量构造逻辑里直接获取这些数据,而是在页面的build方法里通过Provider.of或Consumer来获取。比如:// 在onGenerateRoute中只负责跳转页面 onGenerateRoute: (settings) { return MaterialPageRoute( builder: (context) => TargetScreen(), ); } // 在TargetScreen的build方法中获取provider数据 class TargetScreen extends StatelessWidget { const TargetScreen({super.key}); @override Widget build(BuildContext context) { final userData = Provider.of<UserData>(context); return Scaffold( body: Text(userData.name), ); } }
这样调整后,「Invalid Constant Value」的错误就会消失,同时深层链接的逻辑也能正常工作啦。
备注:内容来源于stack exchange,提问作者Uraam Asif
相关产品推荐
相关产品推荐

