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

Flutter如何将自定义对象传递到其他页面并读取属性值

问题原因

  • 首先存在属性名拼写错误:你自定义的ProductObject类只定义了私有字段_entries,但两个页面的打印逻辑中都调用了不存在的_image字段,调用不存在的属性会返回null,直接做toString操作就触发了类型错误
  • Dart中以下划线_开头的字段是库私有属性,如果ProductObject类和目标页面不在同一个dart文件中,跨文件无法直接访问私有属性,也会拿到null值
  • StatefulWidget的参数不需要手动通过State构造方法传递,Flutter官方推荐直接通过State内置的widget属性读取父组件参数,手动传参反而可能出现上下文不一致导致的空值问题

修正步骤

1. 调整ProductObject类定义

如果需要跨文件访问字段,要么改为公开字段,要么添加公开getter暴露私有字段值:

class ProductObject {
  // 方案1:改为公开字段
  final String entries;
  // 方案2:保留私有字段,添加getter
  // final String _entries;
  // String get entries => _entries;

  ProductObject(this.entries);
}

2. 修改第一页跳转逻辑

return GestureDetector(
  onTap: () { 
    ProductObject productObject = ProductObject(
      'Any Data',
    );
    // 调用存在的属性打印
    print('newProductObject: ${productObject.entries}');
    Navigator.push(context, MaterialPageRoute(builder: (context) => ProductDetail(productObject: productObject)));
  },
  child: const Text('跳转详情页')
);

3. 修改第二页参数接收逻辑

class ProductDetail extends StatefulWidget {
  // 明确参数类型,不要用var
  final ProductObject productObject;
  const ProductDetail({super.key, required this.productObject});

  @override
  State<ProductDetail> createState() => _ProductDetailState();
}

class _ProductDetailState extends State<ProductDetail> {
  // 不需要手动接收参数,直接通过widget属性读取
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: GestureDetector(
        onTap: (){
          // 正确读取参数的属性
          print('newProductObject: ${widget.productObject.entries}');
        },
        child: const Text('text'),
      ),                   
    );
  }
}

额外说明

如果你一定要保留私有字段,需要确保ProductObject和两个页面都在同一个dart文件中,此时可以直接访问私有字段,否则必须通过公开getter暴露值才能跨文件访问。

内容的提问来源于stack exchange,提问作者user16754196

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:00:05