Flutter 使用 SharedPreferences 和 Json 来存储对象

Posted

技术标签:

【中文标题】Flutter 使用 SharedPreferences 和 Json 来存储对象【英文标题】:Flutter using SharedPreferences with Json for storing an object 【发布时间】:2021-12-22 04:59:25 【问题描述】:

我必须存储上次加载的天气信息,因此我使用 toJson 方法从天气对象中获取 Json 文件:

class WeatherResponse
  Temperature? temp;
  Weather? weather;
  String? cityName;
  Coordinates? coord;

  WeatherResponse(this.cityName, this.coord);
  WeatherResponse.favWeather(this.coord,this.weather, this.temp, this.cityName);

  Map<String, dynamic> toJson() => 
    "coord": coord!.toJson(),
    "weather": weather!.toJson(),
    "main": temp!.toJson(),
    "name": cityName,
  ;

  factory WeatherResponse.fromJson(Map<String, dynamic> json) => WeatherResponse.favWeather(
    Coordinates.fromJson(json["coord"]),
    Weather.fromJson(json['weather']),
    Temperature.fromJson(json["main"]),
    json["name"],
  );

加载我的天气信息后,我将数据存储到 SharedPreferences:


...
WeatherResponse? _response;
...
void _saveToJson() async 
    SharedPreferences pref = await SharedPreferences.getInstance();
    String jsonString =_response!.toJson().toString();

    pref.setString(prefKey, jsonString);

    developer.log('Set to shared preferences: ' + pref.getString(prefKey)!);
  

保存的值为coord: lon: 13.4105, lat: 52.5244, weather: description: Mäßig bewölkt, icon: 03d, main: temp: 11.41, name: Berlin 这是不正确的,因为每个字符串值都缺少 "... 正确的输出应该如下所示:"coord": "lon": 13.4105,"lat": 52.5244,"weather":"description": "Mäßig bewölkt","icon": "03d","main": "temp": 11.41,"name": "Berlin" 如果我使用存储的值来获取对象(使用“fromJson”),我会得到以下异常:

response=WeatherResponse.fromJson(json.decode(pref.getString(prefKey)!));
E/flutter ( 4935): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: FormatException: Unexpected character (at character 2)
E/flutter ( 4935): coord: lon: 13.4105, lat: 52.5244, weather: description: Mäßig bewölkt,...
E/flutter ( 4935):  ^

我不知道如何解决这个问题...有人可以帮我吗?

【问题讨论】:

【参考方案1】:

你需要使用 jsonEncode,而不是 toString()。

String jsonString =jsonEncode(_response!.toJson());

【讨论】:

非常感谢!

以上是关于Flutter 使用 SharedPreferences 和 Json 来存储对象的主要内容,如果未能解决你的问题,请参考以下文章

Android开发数据持久化存储,sharePreference(偏好选择)的练习

android中想要对文本框中输入的数据进行保存怎么实现

安卓开发,SharedPreferences,怎么在其它Activity中取数据?

Flutter - Mac上使用VSCode开发Flutter

Flutter屏幕像素适配方案 ( flutter_screenutil 插件 )

Flutter - 使用 google_sign_in 库时未找到 <Flutter/Flutter.h>