如何在 sharedpreferences 中存储多个数据?

Posted

技术标签:

【中文标题】如何在 sharedpreferences 中存储多个数据?【英文标题】:how can i store multiple data in sharedpreferences? 【发布时间】:2021-09-29 12:03:23 【问题描述】:

我正在获取用户信息,例如用户名、个人资料图片和名称。我想将所有这些信息存储在 Sharedpreferences 中,这样我就不必每次需要它们时都调用 firebase。 这是我获取数据的方式,我如何存储这些数据,以便以后通过用户名检查用户名及其个人资料?

storeUsersInfo()async
    print('STORE CALLED');
    QuerySnapshot querySnapshot = await DatabaseMethods().getUsers();
    var length = querySnapshot.docs.length ;
      print(length);
      int i = 0 ;
    while (  i < length ) 
      print(name = "$querySnapshot.docs[i]["name"]");
      print(profilePicUrl = "$querySnapshot.docs[i]["profileURL"]");
      i++;

    
  

这是 firebase 调用

 Future<QuerySnapshot> getUsers() async 
    return await FirebaseFirestore.instance
        .collection("users")
        .get();
  

如果有人需要其他任何东西,请询问。

【问题讨论】:

【参考方案1】:

SharedPreferences 需要一个键和数据。 在异步函数中使用它。 这个语法是sharedPreferences.setString(key, value) 所以在一个函数中,

SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
sharedPreferences.setString("token", jsonResponse['access_token'].toString());
sharedPreferences.setString("userId", jsonResponse['customer_id'].toString());

您可以通过sharedPreferences.getString(key).Like 获取存储的数据

var token = sharedPreferences.getString("token");

【讨论】:

我想做的是这个。 (***.com/questions/68422121/…)。但无法实现任何目标。我也尝试通过流监听调用getUserInfo,但它不起作用【参考方案2】:

您可以将所有信息存储在 SharePreference 中,方法是在存储图片对象之前将它们编码为 Base64String。

如何编码:

Future<String> encodeImageToBase64String(String imageUrl) async 
  
  final response = await client.get(Uri.parse(imageUrl));
 
  final base64 = base64Encode(response.bodyBytes);

  return base64;

编码图像后,您可以将其缓存到 sharedPreference 使用

SharedPreferences pref = await SharedPreferences.getInstance();

//Save string to SharedPreference
pref.setString('image', encodedImageString);

以后如何解码和使用图像

//Get Encoded Image String from SharedPreferences
final base64String = pref.getString('image');

///Decodes Images file encoded to Base64String to Image
Uint8List decodeImageFromBase64String(String base64String) 
  return base64Decode(base64String);


最后,您可以像这样在Image Widget 中使用它

...
Image(image: MemoryImage(decodeImageFromBase64String))

假设您要缓存从 firebase 获取的名称、用户名和图像

//Create a model for the firebase data
class UserModel
  final String name;
  final String username;
  final String encodedImage;
  
  UserModel(this.name, this.username, this.encodedImage);
  
  String toJson()
    Map<String, dynamic> userMap = 
      'name': name,
      'username': username,
      'image': encodedImage,
    ;
    
    return json.encode(userMap);
  

//Encode the image HERE
encodeImageToBase64String(imageUrl);
 
//Pass in the parameters to the UserModel() constructor and Call //the toJson(), then Cache the Resulting String
String stringToCache = UserModel(nameString, usernameString, encodedImageString).toJson();

【讨论】:

好的。所以问题是我正在接收最后一条消息和用户名的流,所以我该如何存储它,假设你给我发了消息,我有你的用户名,你的所有信息都在 firebase 中,所以我想将它们分配给你的最后一条消息。所以我可以把它和用户名、姓名和个人资料一样存储起来,这样我就可以和你的最后一条消息一起显示了吗? 让我搞清楚。您想更新 SharedPreferences 中已有的信息,对吗?我还假设您需要将获取的数据存储为单个对象,而不仅仅是图像对象 是的,我正在尝试解决这个问题(***.com/questions/68422121/…),因为我找不到任何解决方案。 我刚刚添加了更多细节来帮助您解决问题。这会将所有数据存储为一个对象。我已经实现了它并且它有效【参考方案3】:

您可以使用像 https://pub.dev/packages/firestore_cache 这样的缓存来为您完成这项工作。

【讨论】:

以上是关于如何在 sharedpreferences 中存储多个数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中使用SharedPreference存储动态表值[重复]

如何使用 SharedPreferences 系统地存储和获取数据?

如何使用提供程序将 List<object> 存储在 sharedpreferences 中?

如何使用 Sharedpreferences 存储 EditText 样式(粗体、斜体、颜色等)

Android:如何在 SharedPreferences for android 中存储字符串数组

如何在 SharedPreferences 中保存和检索日期