在flutter中的共享首选项中将数据存储为对象

时间:2018-12-26 11:33:05

标签: flutter

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

6 个答案:

答案 0 :(得分:5)

要将对象保存到共享首选项

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

答案 1 :(得分:4)

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

要保存数据,必须转成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>;

答案 2 :(得分:3)

您需要先将其序列化为JSON,然后保存并在阅读后反序列化

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

答案 3 :(得分:0)

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

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
        };
      }
    }

答案 4 :(得分:0)

从API获取数据并将其保存到共享首选项中

 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;
 }

我创建了获取详细信息的功能 您可以在App的任何位置调用此功能

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

答案 5 :(得分:0)

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

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

类似的事情,我的缺点是,如果JSON字符串数据太多,则不建议存储所有字符串,而是反序列化并采用您认为必要的字符串。