Dart访问List嵌套Map内自定义Transaction对象取值异常如何解决
问题原因
- 执行
assets[0]['transactions']返回Instance of 'Transaction'不属于取值失败,这是Dart打印自定义类实例的默认输出,证明你已经拿到了目标对象,只是没有访问对象属性,也没有给类配置可读的输出格式。 - 偶尔返回null是因为你没有给列表和Map显式声明类型,Dart类型推导异常导致的取值失败。
- 隐藏逻辑错误:你当前Transaction类里id字段的写法有误,
Random().toString()拿到的是随机数生成器实例的默认字符串,不是随机生成的id值。
解决方案
1. 正确访问对象属性
从Map中取出的值默认是dynamic类型,先强转为Transaction类型,再访问内部属性即可拿到具体值:
final firstTransaction = assets[0]['transactions'] as Transaction; // 访问对应属性 print(firstTransaction.from); // 输出 someone print(firstTransaction.amount); // 输出 1.0 print(firstTransaction.id); // 输出对应id值
2. 自定义对象打印格式
如果需要直接打印Transaction对象就能看到完整内容,重写类的toString()方法即可,同时修复id生成的错误写法:
import 'dart:math'; class Transaction { // 修复id生成逻辑,生成0-99999之间的随机数字作为id final String id = Random().nextInt(99999).toString(); final String from; final double amount; Transaction({ required this.from, required this.amount, }); // 重写toString方法,自定义打印内容 @override String toString() { return 'Transaction{id: $id, from: $from, amount: $amount}'; } }
修改后你再打印assets[0]['transactions'],就会直接输出类似Transaction{id: 12345, from: someone, amount: 1.0}的可读内容,不会再显示Instance of 'Transaction'。
3. 显式声明集合类型避免null问题
给assets列表显式声明类型,避免类型推导异常导致的取值为null问题:
final List<Map<String, dynamic>> assets = [ { "name": "BRL", "balance": 150.2, "transactions" : Transaction(from: "someone", amount: 1) }, { "name": "US", "balance": 1100.2, "transactions" : Transaction(from: "someone", amount: 5) }, ];
内容的提问来源于stack exchange,提问作者Müller
相关产品推荐
相关产品推荐

