【问题标题】:Store data as an object in shared preferences in flutter在颤动中将数据作为对象存储在共享首选项中
【发布时间】:2019-05-24 16:25:24
【问题描述】:

我想在共享首选项中存储一个对象,其中包含一些字段,如姓名、年龄、电话号码等。我不知道如何在颤振中将对象存储在共享首选项中。

【问题讨论】:

    标签: flutter


    【解决方案1】:

    您可以将对象存储在共享首选项中,如下所示:

    SharedPreferences shared_User = await SharedPreferences.getInstance();
                Map decode_options = jsonDecode(jsonString);
                String user = jsonEncode(User.fromJson(decode_options));
                shared_User.setString('user', user);
    
    SharedPreferences shared_User = await SharedPreferences.getInstance();
                Map userMap = jsonDecode(shared_User.getString('user'));
                var user = User.fromJson(userMap);
    
        class User {
          final String name;
          final String age;
    
          User({this.name, this.age});
    
          factory User.fromJson(Map<String, dynamic> parsedJson) {
            return new User(
                name: parsedJson['name'] ?? "",
                age: parsedJson['age'] ?? "");
          }
    
          Map<String, dynamic> toJson() {
            return {
              "name": this.name,
              "age": this.age
            };
          }
        }
    

    【讨论】:

    • 请添加关于这段代码的简短描述。
    • jsonString 是什么?
    • jsonString是Api的一个response(response.body)。
    【解决方案2】:

    在这里搜索了很多文章后,你是

    为了保存数据,必须转换为 JSON

     SharedPreferences prefs = await SharedPreferences.getInstance();
    
       Map<String, dynamic> user = 
        {'Usrname':'tom','Password':'pass@123'};
    
    bool result = await prefs.setString('user', jsonEncode(user));
    

    对于 Gettin 数据,必须从 JSON 反转换

    String userPref = prefs.getString('user');
         
    Map<String,dynamic> userMap = jsonDecode(userPref) as Map<String, dynamic>;
    

    【讨论】:

    • 感谢@OmarEssam,解释本身就足够了。如果有人需要一个完整的例子,那么我找到了这篇文章betterprogramming.pub/…
    • 我似乎无法将编码的 JSON 对象保存到“setString”方法中我得到“Dart 未处理异常:将对象转换为可编码对象失败:”
    【解决方案3】:

    将对象保存到共享首选项

    SharedPreferences pref = await SharedPreferences.getInstance();
    Map json = jsonDecode(jsonString);
    String user = jsonEncode(UserModel.fromJson(json));
    pref.setString('userData', user);
    

    从共享首选项中获取对象

    SharedPreferences pref = await SharedPreferences.getInstance();
    Map json = jsonDecode(pref.getString('userData'));
    var user = UserModel.fromJson(json);
    

    你需要导入下面提到的包

    import 'package:shared_preferences/shared_preferences.dart';
    import 'dart:convert';
    

    创建模型的最简单方法 按照这个答案-> https://stackoverflow.com/a/58708634/9236994

    【讨论】:

    • 这里的jsonstring是什么?
    • 传入 jsonDecode 的“jsonString”是什么?
    • @Diwakar 这是您要保存的 json 对象字符串(通常是您从 API 获得的要保存的响应)
    【解决方案4】:

    需要先序列化成JSON再保存,读取后反序列化

    详情请见https://flutter.io/docs/development/data-and-backend/json

    【讨论】:

      【解决方案5】:

      从 API 获取数据并将其保存到 Sharepreference 时

       Future<UserDetails> UserInfo({String sesscode, regno}) async{
      await Future.delayed(Duration(seconds: 1));
      SharedPreferences preferences = await SharedPreferences.getInstance();
       var map = new Map<String, String>();
      map["sesscode"] = sesscode;
      map["regno"] = regno;
      
       var response = await http.post(Base_URL().user_info, body: map);
       Map decodedata = json.decode(response.body);
       if(decodedata != null){
        String user = jsonEncode(UserDetails.fromJson(decodedata));
        preferences.setString(SharePrefName.infoPref, user);
        return UserDetails.fromJson(decodedata);
      }
        return null;
       }
      

      我创建了一个获取详细信息的函数 您可以在应用程序的任何位置调用此函数

      Future<UserDetails> getSavedInfo()async{
       SharedPreferences preferences = await SharedPreferences.getInstance();
       Map userMap = jsonDecode(preferences.getString(SharePrefName.infoPref));
        UserDetails user = UserDetails.fromJson(userMap);
        return user;
       }
      

      现在,我在一个类中调用它来获取用户名

      Future<UserDetails> usd = getSavedInfo();
             usd.then((value){
               print(value.surname);
             });
      

      【讨论】:

        【解决方案6】:

        如果您从 API 获取数据,最初从 API 端点获取的是字符串,因此您可以将数据存储为原始字符串,并在需要时对其进行反序列化并在您想使用的地方使用它

        https://gist.github.com/k1ycee/33bb7e51dac81093f949bbd30d7d0dc9

        类似这样,我觉得缺点是如果 JSON 字符串数据太多,可能不建议存储所有字符串,而是将其反序列化并获取您认为必要的字符串。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-11
          • 2011-07-22
          • 1970-01-01
          • 2017-12-02
          相关资源
          最近更新 更多