Flutter将页面名作为类模型属性传递跳转报name!=null错误如何解决
问题原因
- 路由名赋值格式错误:你在
ZekrProvider中初始化ZekrModel时,给zekrPage字段赋值的'AlsabahScreen.id'加了单引号,把类静态常量引用变成了普通字符串常量,无法匹配路由表的注册key。 - 路由常量不匹配:你的路由配置表中,
AlsabahScreen对应的注册key是AlsabahScreen.routeName,但你在模型中存储的是AlsabahScreen.id,两个常量不一致,就算去掉引号也无法匹配到正确路由。 - 可选参数空值风险:
ZekrModel的构造参数为可选类型,未加非空限制,若某个实例漏传zekrPage参数,就会直接导致跳转时路由名为空,触发报错。
解决步骤
- 统一页面路由常量
先确认AlsabahScreen类内的静态路由名定义,和路由表注册的key保持一致,示例:
class AlsabahScreen extends StatelessWidget { // 路由表中用的是routeName,就统一用该字段作为路由常量 static const String routeName = '/alsabah_screen'; // 其余页面代码 }
- 修正Provider中的常量引用
去掉zekrPage赋值的单引号,直接引用类的静态常量:
class ZekrProvider with ChangeNotifier{ List<ZekrModel> _zekrList = [ ZekrModel( zekrTitle: 'أذكار المساء', zekrImage: 'assets/images/az6.png', // 去掉引号,直接引用静态常量,和路由表key完全一致 zekrPage: AlsabahScreen.routeName, ), ]; // 其余代码 }
- 增加空安全校验(可选优化)
如果你的项目是Flutter空安全版本,给ZekrModel的构造参数加required修饰,编译期避免漏传参数:
class ZekrModel { final String zekrTitle; final String zekrImage; final String zekrPage; ZekrModel({ required this.zekrTitle, required this.zekrImage, required this.zekrPage, }); }
同时可以给跳转逻辑加判空,避免异常场景崩溃:
zekrRoute: (){ final targetRoute = value.zekrList[index].zekrPage; if (targetRoute != null && targetRoute.isNotEmpty) { Navigator.pushNamed(context, targetRoute); } },
内容的提问来源于stack exchange,提问作者Amr El-Baroudy
相关产品推荐
相关产品推荐

