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

how can i store multiple data in sharedpreferences?

我正在获取用户信息,例如用户名、个人资料照片和姓名。我想将所有这些信息存储在 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();
  }

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

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");

您可以将图片对象编码为Base64String后再存储,将所有信息存储在SharePreference中。

编码方式:

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 小部件中使用它

...
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();

您可以使用像 https://pub.dev/packages/firestore_cache 这样的缓存,它会为您做到这一点。