如何在 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 样式(粗体、斜体、颜色等)