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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 15:41:12