You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从SharedPreferences读取数据仅显示第一条记录的修复求助

问题解决: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,
  });
}

问题原因

  1. 原代码仅将SharedPreferences中所有值按key顺序存入列表,直接取前三个元素创建单个User对象,完全未对多用户数据进行分组处理
  2. 未利用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 20:19:58