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
相关产品推荐
相关产品推荐

