Json 回调填充的不是具有 SharedPreferences 的对象

Json callback filled not the object with SharedPreferences

你好,我是 Flutter 的新手,我需要帮助。

我的用例是,我有一个 UserClass、一个 SharedPreferencesModel 和一个 DashboardScreen,其中包含从 Internet 获取的 UserData。但是 UserData 存储在缓存中,通过调用 Function 'loadUser' 和来自 SharedPreferencesModel 的 'readData'-Function,没有填充来自 UserClass 的对象 User...

这里是用户类:

class User {
  final String firstname;
  final String lastname;
  final String club;
  final String year;
  final String gender;

  User({this.firstname, this.lastname, this.year, this.club, this.gender});

  factory User.fromJson(Map<String, dynamic> json) {
    return new User(
        firstname: json['firstname'],
        lastname: json['lastname'],
        year: json['year_of_birth'],
        club: json['club'],
        gender: json['gender']);
  }

  Map<String, dynamic> toJson() {
    return {
      'firstname': this.firstname,
      'lastname': this.lastname,
      'club': this.club,
      'year_of_birth': this.year,
      'gender': this.gender,
    };
  }
}

这是我的 SharedPreferencesModel:

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

class SharedPreferencesModel {
  // save
  storeData(String key, value) async {
    final preferences = await SharedPreferences.getInstance();
    await preferences.setString(key, jsonEncode(value));
  }

  // read
  readData(String key) async {
    final preferences = await SharedPreferences.getInstance();
    return jsonDecode(preferences.getString(key));
  }

  // remove
  deleteData(String key) async {
    final preferences = await SharedPreferences.getInstance();
    preferences.remove(key);
  }
}

这是小部件的一个片段:

SharedPreferencesModel data = new SharedPreferencesModel();
  User userDataLoad = new User();

  loadUser() async {
    try {
      // Data are displayed as json in the debugging-terminal
      print(await data.readData("user"));

      // something its wrong here
      User user = User.fromJson(await data.readData("user"));

      // "Test 2" is not displayed
      print("Test 2");

      Scaffold.of(context).showSnackBar(SnackBar(
          content: new Text('Daten werden geladen...'),
          duration: const Duration(milliseconds: 1000)));
      userDataLoad = user;
    } catch (Exception) {
      Scaffold.of(context).showSnackBar(SnackBar(
          content: new Text('Keine Daten gefunden!'),
          duration: const Duration(milliseconds: 1000)));
    }
  }

  void initState() {
    super.initState();
    loadUser();
    // only for testing
    print("test 1");
  }

  @override
  Widget build(BuildContext context) {
    ...

感谢您的帮助!

这里:

  readData(String key) async {
    final preferences = await SharedPreferences.getInstance();
    return jsonDecode(preferences.getString(key));
  }

您现在基本上是将 Future 对象作为参数传递给您的 jsonDecode 函数。 我猜你需要在 preferences.getString(key) 之前放一个等待,因为它是一个未来。 所以它将是以下内容:

  readData(String key) async {
    final preferences = await SharedPreferences.getInstance();
    return jsonDecode(await preferences.getString(key));
  }

[已解决]

错误是转换错误。

将来自 response.body 的数据存储为字符串

try {
    if (response.statusCode == 200) {
      return _data.storeData("user", response.body); <<<<< 
    } else {
      throw Exception('Get Fail!');
    }
  } catch (error) {
    throw Exception(error);
  }

这里是函数 storeData,将数据保存为字符串中的字符串 非常糟糕的失败

class SharedPreferencesModel {
  // save
  storeData(String key, value) async {
    final preferences = await SharedPreferences.getInstance();
    await preferences.setString(key, jsonEncode(value));  <<<<<<<<<<<<<
  }

这里是解决方案 仅保存值

class SharedPreferencesModel {
  // save
  storeData(String key, value) async {
    final preferences = await SharedPreferences.getInstance();
    await preferences.setString(key, value);  <<<<<<<<<<<<< 
  }

感谢帮助!