Flutter报错NoSuchMethodError:String类无logo属性访问器
问题原因
报错NoSuchMethodError: Class 'String' has no instance getter 'logo'的核心原因是:你从Hive读取到的每个数据元素是字符串类型(虽然打印出来像Map格式,但本质是字符串),而非真正的Map或自定义对象,因此无法通过.logo的方式访问属性。
解决方案
临时修复:将字符串解析为Map
如果已经在Hive中存储了字符串格式的Map,可以在读取时将其解析为真正的Map对象:
- 导入
dart:convert包:
import 'dart:convert';
- 修改
LoadData函数,将每个字符串元素解析为Map:
Future<List<Map<String, dynamic>>> LoadData() async { final box = await Hive.box<dynamic>('my_db'); return box.values.map((value) { // 判断是否为字符串,是则解析为Map if (value is String) { return jsonDecode(value) as Map<String, dynamic>; } // 已经是Map则直接返回 return value as Map<String, dynamic>; }).toList(); }
- 修改ListView中的属性访问方式,同时注意用循环的
index而非固定的1(否则所有列表项都会显示第二个元素的内容):
Text( snapshot.data[index]['logo'].toString(), style: const TextStyle( fontWeight: FontWeight.bold, fontSize: 20, color: Colors.blue, ), )
规范方案:使用Hive TypeAdapter存储自定义对象
这是Hive的标准用法,能避免手动解析的麻烦:
- 创建数据类并生成适配器:
import 'package:hive/hive.dart'; @HiveType(typeId: 0) class NetworkCard extends HiveObject { @HiveField(0) late int id; @HiveField(1) late String network; @HiveField(2) late int discount; @HiveField(3) late String logo; NetworkCard({required this.id, required this.network, required this.discount, required this.logo}); }
运行命令生成适配器:
flutter packages pub run build_runner build
- 在
main函数中初始化Hive并注册适配器:
import 'package:hive_flutter/hive_flutter.dart'; import 'network_card.dart'; // 导入你的数据类 void main() async { await Hive.initFlutter(); Hive.registerAdapter(NetworkCardAdapter()); await Hive.openBox<NetworkCard>('my_db'); runApp(const MyApp()); }
- 修改
LoadData函数返回自定义对象列表:
Future<List<NetworkCard>> LoadData() async { final box = await Hive.box<NetworkCard>('my_db'); return box.values.toList(); }
- 在ListView中直接访问对象属性:
Text( snapshot.data[index].logo, style: const TextStyle( fontWeight: FontWeight.bold, fontSize: 20, color: Colors.blue, ), )
内容的提问来源于stack exchange,提问作者Eniedi Monday
相关产品推荐
相关产品推荐

