Flutter中List<myPerson>打印显示Instance of问题求助
问题:打印自定义类实例列表显示"Instance of"而非属性值
问题详情
定义了包含name、age、height属性的myPerson类,创建mypeople列表并添加该类实例后,直接打印列表显示Instance of 'myPerson',但单独打印实例的name、age、height能得到正确数据。尝试添加toString方法、使用${p.name}格式均无效,执行mypeople.add(MyPerson(name: p.name,age:p.age , height:p.height))后打印列表仍显示Instance of。
问题原因
- 类名大小写不一致:Dart是大小写敏感语言,代码中类名定义为
myPerson,但添加实例时用了MyPerson,导致创建的实例不属于目标类,重写的toString()无法生效。 - 未正确重写
toString():自定义类默认的toString()方法仅返回Instance of 'ClassName',必须手动重写该方法定义实例的打印格式。 - 代码语法错误:原代码中
PeopleList定义为列表变量,却以函数形式调用await PeopleList(),存在逻辑错误。
解决方案
步骤1:统一类名并重写toString()
遵循Dart大驼峰命名规范,将类名改为MyPerson,并在类内重写toString()方法,自定义实例的打印格式。
步骤2:修正代码逻辑错误
调整PeopleList的定义(假设是异步获取数据的函数),确保遍历和实例化的逻辑正确。
修正后的完整代码
// 模拟异步获取人员数据的函数 Future<List<Map<String, dynamic>>> PeopleList() async { return [ {"name": "Ana", "age": 25, "height": 165}, {"name": "Ron", "age": 30, "height": 180}, {"name": "Jack", "age": 22, "height": 175}, {"name": "Tom", "age": 28, "height": 178}, {"name": "Lisa", "age": 26, "height": 162}, {"name": "Frank", "age": 32, "height": 185}, ]; } class MyPerson { String name; int age; int height; MyPerson({required this.name, required this.age, required this.height}); // 重写toString,自定义实例打印内容 @override String toString() { return 'MyPerson(name: $name, age: $age, height: $height)'; } } class MyHomePageState extends State<MyHomePage> { List<MyPerson> mypeople = []; Future<List<MyPerson>> getPeople() async { for(var p in await PeopleList()) { if(p.isNotEmpty) { // 使用统一的类名MyPerson创建实例 mypeople.add(MyPerson(name: p['name'], age: p['age'], height: p['height'])); } } print(mypeople); // 现在会打印每个实例的具体属性信息 return mypeople; } }
关键说明
- 重写
toString()是解决打印问题的核心,只有这样Dart才会按照你定义的格式输出实例内容。 - 严格遵守Dart的命名规范和大小写敏感规则,避免因类名不一致导致的逻辑错误。
- 确保异步数据获取的逻辑正确,
await仅用于异步函数调用,不能直接作用于列表变量。
内容的提问来源于stack exchange,提问作者DktPhl2018
相关产品推荐
相关产品推荐

