【问题标题】:how can i store multiple data in sharedpreferences?如何在 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();
  }

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

【问题讨论】:

    标签: flutter dart firebase-realtime-database google-cloud-firestore sharedpreferences


    【解决方案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");
    

    【讨论】:

    【解决方案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 中已有的信息,对吗?我还假设您需要将获取的数据存储为单个对象,而不仅仅是图像对象
    • 是的,我正在尝试解决这个问题(stackoverflow.com/questions/68422121/…),因为我找不到任何解决方案。
    • 我刚刚添加了更多细节来帮助您解决问题。这会将所有数据存储为一个对象。我已经实现了它并且它有效
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2015-02-26
      • 2011-11-02
      • 1970-01-01
      • 2018-06-13
      • 2013-08-10
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      相关资源
      最近更新 更多