Flutter报错:类型‘Object’未定义getter‘product’求助
Flutter路由参数获取错误:The getter 'product' isn't defined for the type 'Object'
我在开发Flutter安卓应用时,无法获取商品详情,代码中body: Body(product: arguments.product)处出现错误提示:"The getter 'product' isn't defined for the type 'Object'"。我已尝试body: Body(product: arguments?.product)等网上的解决方法,但问题仍未解决,已经卡了一周。我是Flutter新手,只知道这段代码是用来从点击的商品项中获取商品名称,希望能得到帮助。
相关代码
class DetailsScreen extends StatelessWidget { static String routeName = "/details"; @override Widget build(BuildContext context) { final Object? arguments = ModalRoute.of(context)!.settings.arguments != null; var product; return Scaffold( backgroundColor: Color(0xFFF5F6F9), appBar:AppBar( backgroundColor: Colors.transparent, leading: Padding( padding: const EdgeInsets.only(left: 20.0,), child: CircleAvatar( backgroundColor: kPrimaryColor, child: IconButton( icon: Icon(Icons.arrow_back_ios), color: Colors.white, onPressed: (){ Navigator.pop(context); }, ), ), ), leadingWidth: 70.0, ), body: Body(product: arguments.product), ); } } class ProductDetailsArguments { late final Product product; ProductDetailsArguments({required this.product}); }
问题原因&解决方案
核心问题有两个:一是你错误地把arguments赋值成了布尔值(ModalRoute.of(context)!.settings.arguments != null是判断语句,返回bool类型),二是没有将参数转换为你定义的ProductDetailsArguments类型,导致编译器识别它为Object,自然找不到product属性。
步骤1:修正参数获取方式
把获取参数的代码从:
final Object? arguments = ModalRoute.of(context)!.settings.arguments != null;
改成:
final ProductDetailsArguments? arguments = ModalRoute.of(context)!.settings.arguments as ProductDetailsArguments?;
这一步是把路由传递过来的参数转换成你自定义的ProductDetailsArguments类型,这样编译器就能识别它的product属性了。
步骤2:安全传递参数给Body组件
因为参数可能为空(比如跳转时没传),所以要做空判断,避免报错:
body: arguments != null ? Body(product: arguments.product) : const Center(child: Text("暂无商品数据")),
如果你的场景中参数一定存在,也可以用!强制解包,但不推荐:
body: Body(product: arguments!.product),
步骤3:确保跳转时传递正确的参数
在跳转到DetailsScreen的地方,要传递ProductDetailsArguments对象,比如:
Navigator.pushNamed( context, DetailsScreen.routeName, arguments: ProductDetailsArguments(product: 你选中的商品对象), );
修改后的完整代码
class DetailsScreen extends StatelessWidget { static String routeName = "/details"; @override Widget build(BuildContext context) { // 转换为正确的参数类型 final ProductDetailsArguments? arguments = ModalRoute.of(context)!.settings.arguments as ProductDetailsArguments?; return Scaffold( backgroundColor: const Color(0xFFF5F6F9), appBar: AppBar( backgroundColor: Colors.transparent, leading: Padding( padding: const EdgeInsets.only(left: 20.0), child: CircleAvatar( backgroundColor: kPrimaryColor, child: IconButton( icon: const Icon(Icons.arrow_back_ios), color: Colors.white, onPressed: () { Navigator.pop(context); }, ), ), ), leadingWidth: 70.0, ), // 安全传递参数 body: arguments != null ? Body(product: arguments.product) : const Center(child: Text("暂无商品数据")), ); } } class ProductDetailsArguments { // 去掉late,因为构造函数已经通过required完成初始化 final Product product; ProductDetailsArguments({required this.product}); }
内容的提问来源于stack exchange,提问作者Indra Sekar
相关产品推荐
相关产品推荐

