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

如何在SharedPreferences中存储多份用户数据,通过用户名查询对应信息

实现方案

核心逻辑是将用户数据整理为以用户名为key的映射结构,序列化后存入SharedPreferences,读取时直接通过key即可秒查对应信息,无需遍历。

前置准备

需要引入官方shared_preferences依赖,同时依赖Dart内置的dart:convert做JSON序列化:

  • 先在pubspec.yaml的dependencies节点下添加:
shared_preferences: ^2.2.2
  • 在用到的代码文件头部导入依赖:
import 'package:shared_preferences/shared_preferences.dart';
import 'dart:convert';

存储逻辑实现

修改你的storeUsersInfo方法如下:

storeUsersInfo() async {
  print('STORE CALLED');
  QuerySnapshot querySnapshot = await DatabaseMethods().getUsers();
  var length = querySnapshot.docs.length;
  print(length);
  // 构建以用户名为key的用户信息Map
  Map<String, Map<String, String>> userMap = {};
  for (var doc in querySnapshot.docs) {
    // 假设你的文档ID就是用户名,如果你是把用户名存在字段里就改成doc["username"]
    String username = doc.id;
    String name = doc["name"];
    String profilePicUrl = doc["profileURL"];
    userMap[username] = {
      "name": name,
      "profileURL": profilePicUrl
    };
  }
  // 序列化为JSON字符串存入SharedPreferences
  SharedPreferences sp = await SharedPreferences.getInstance();
  await sp.setString("all_user_info", jsonEncode(userMap));
}

快速查询实现

需要查询指定用户名的信息时调用如下方法即可:

Future<Map<String, String>?> getUserInfoByUsername(String username) async {
  SharedPreferences sp = await SharedPreferences.getInstance();
  String? userInfoStr = sp.getString("all_user_info");
  if (userInfoStr == null) return null;
  Map userMap = jsonDecode(userInfoStr);
  return userMap[username] as Map<String, String>?;
}

注意事项

  • 如果你的Firebase用户数据有更新,需要重新调用storeUsersInfo方法更新本地缓存
  • SharedPreferences适合存储轻量数据,如果你的用户量超过1000条,建议改用Hive、SQLite这类本地数据库方案,性能会更好

内容的提问来源于stack exchange,提问作者vikrant yadav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 05:51:01