Flutter中SharedPreferences数据无法在Table组件显示的解决求助
问题原因及解决方法
核心问题点
- Key匹配错误:Flutter的SharedPreferences会自动给存储的key添加
flutter.前缀,你代码里判断key.startsWith('User_')永远不会命中,实际存储的key是flutter.User_aaa_name这类格式。 - 数据结构不匹配:你把用户的每个字段(姓名、分数、邮箱)单独存为一个key,但代码里却试图读取单个key对应的逗号分隔字符串来拆分用户信息,逻辑完全不匹配。
- 未触发UI更新:异步获取数据后没有调用
setState(),就算users列表被填充,UI也不会自动刷新。
修正后的完整代码
1. 确保User类定义正确
class User { final String name; final String score; final String email; User({required this.name, required this.score, required this.email}); }
2. 修正数据读取与UI更新逻辑
List<User> users = []; @override void initState() { super.initState(); _getUsersData(); } Future<void> _getUsersData() async { SharedPreferences prefs = await SharedPreferences.getInstance(); List<String> keys = prefs.getKeys().toList(); // 收集所有用户的唯一标识(比如从flutter.User_aaa_name中提取aaa) Set<String> userIds = {}; for (String key in keys) { if (key.startsWith('flutter.User_')) { List<String> parts = key.split('_'); if (parts.length >= 3) { userIds.add(parts[2]); } } } // 根据用户ID读取对应的字段并组装User对象 for (String userId in userIds) { String name = prefs.getString('flutter.User_${userId}_name') ?? ''; String score = prefs.getString('flutter.User_${userId}_score') ?? ''; String email = prefs.getString('flutter.User_${userId}_email') ?? ''; if (name.isNotEmpty && score.isNotEmpty && email.isNotEmpty) { users.add(User( name: name, score: score, email: email, )); } } // 通知Flutter刷新UI setState(() {}); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('所有记录展示'), ), body: Center( child: Table( border: TableBorder.all(), children: [ const TableRow( children: [ TableCell(child: Center(child: Text('姓名'))), TableCell(child: Center(child: Text('分数'))), TableCell(child: Center(child: Text('邮箱'))), ], ), for (User user in users) TableRow( children: [ TableCell(child: Center(child: Text(user.name))), TableCell(child: Center(child: Text(user.score))), TableCell(child: Center(child: Text(user.email))), ], ), ], ), ), ); }
额外说明
- 用
Set<String>存储用户ID是为了避免重复处理同一个用户的多个字段key - 读取字段时加了非空判断,避免空数据混入列表
- 补全了你代码中未闭合的Widget结构(原代码的Table和Scaffold没有闭合)
内容的提问来源于stack exchange,提问作者flutter app
相关产品推荐
相关产品推荐

