从SharedPreferences读取数据仅显示第一条记录的修复求助
问题描述
在SharedPreferences中存储了多条用户记录,使用Flutter的Table类创建表格,想要以姓名、邮箱、分数的格式展示这些记录,但代码运行后仅显示第一条记录。
SharedPreferences存储内容
<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map> <string name="flutter.User_aaa_name">aaa</string> <string name="flutter.User_uuu_email">digrev@gmail.com</string> <string name="flutter.User_aaa_score">5</string> <string name="flutter.User_uuu_score">0</string> <string name="flutter.User_uuu_name">uuu</string> <string name="flutter.User_uuu_password">123</string> <string name="flutter.User_aaa_email">digrev@gmail.com</string> <string name="flutter.User_aaa_password">123</string> </map>
原Flutter展示代码
import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; class MyTable extends StatefulWidget { @override _MyTableState createState() => _MyTableState(); } class _MyTableState extends State<MyTable> { List<User> users = []; @override void initState() { super.initState(); _getUsersData(); } Future<void> _getUsersData() async { SharedPreferences prefs = await SharedPreferences.getInstance(); List<String> keys = prefs.getKeys().toList(); List<Object> userDataList = []; for (String key in keys) { Object? userData = prefs.get(key); userDataList.add(userData!); } print(userDataList); { users.add(User( name: userDataList[0].toString(), score: userDataList[1].toString(), email: userDataList[2].toString(), )); print("length " + users.length.toString()); } setState(() {}); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Tüm Kayıtları Göster'), ), body: Center( child: Table( border: TableBorder.all(), children: [ TableRow( children: [ TableCell( child: Center(child: Text('Adı')), ), TableCell( child: Center(child: Text('Puanı')), ), TableCell( child: Center(child: Text('E-posta')), ), ], ), 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)), ), ], ), ], ), ), ); } } class User { final String name; final String score; final String email; User({ required this.name, required this.score, required this.email, }); }
问题原因
- 原代码仅将SharedPreferences中所有值按key顺序存入列表,直接取前三个元素创建单个
User对象,完全未对多用户数据进行分组处理 - 未利用SharedPreferences中key的命名规则(
flutter.User_{userId}_{field})来区分不同用户的字段数据
修正方案
修改_getUsersData方法,先提取所有唯一的用户ID,再根据ID拼接对应的字段key,获取每个用户的完整信息并创建User对象:
Future<void> _getUsersData() async { SharedPreferences prefs = await SharedPreferences.getInstance(); Set<String> keys = prefs.getKeys(); // 提取所有唯一的用户ID Set<String> userIds = {}; for (String key in keys) { if (key.startsWith('flutter.User_')) { // 拆分key获取userId:flutter.User_aaa_name -> aaa List<String> parts = key.split('_'); if (parts.length >= 3) { userIds.add(parts[2]); } } } // 根据userId组装每个用户的信息 for (String userId in userIds) { String? name = prefs.getString('flutter.User_${userId}_name'); String? email = prefs.getString('flutter.User_${userId}_email'); String? score = prefs.getString('flutter.User_${userId}_score'); // 确保必要字段不为空再添加 if (name != null && email != null && score != null) { users.add(User( name: name, score: score, email: email, )); } } setState(() {}); }
完整修正后代码
import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; class MyTable extends StatefulWidget { @override _MyTableState createState() => _MyTableState(); } class _MyTableState extends State<MyTable> { List<User> users = []; @override void initState() { super.initState(); _getUsersData(); } Future<void> _getUsersData() async { SharedPreferences prefs = await SharedPreferences.getInstance(); Set<String> keys = prefs.getKeys(); // 提取所有唯一的用户ID 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]); } } } // 组装每个用户的完整信息 for (String userId in userIds) { String? name = prefs.getString('flutter.User_${userId}_name'); String? email = prefs.getString('flutter.User_${userId}_email'); String? score = prefs.getString('flutter.User_${userId}_score'); if (name != null && email != null && score != null) { users.add(User( name: name, score: score, email: email, )); } } 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)), ), ], ), ], ), ), ); } } class User { final String name; final String score; final String email; User({ required this.name, required this.score, required this.email, }); }
内容的提问来源于stack exchange,提问作者flutter app
相关产品推荐
相关产品推荐

