【问题标题】:Json callback filled not the object with SharedPreferencesJson 回调未使用 SharedPreferences 填充对象
【发布时间】:2020-12-22 09:05:21
【问题描述】:

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

我的用例是,我有一个 UserClass、一个 SharedPreferencesModel 和一个带有从 Internet 获取的 UserData 的 DashboardScreen。但是 UserData 存储在缓存中,并通过调用内部 SharedPreferencesModel 中的“readData”-Function 函数“loadUser”,没有填充来自 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) {
    ...

感谢您的帮助!

【问题讨论】:

  • 说实话,我并没有真正理解你的问题是什么。但乍一看,您的async 函数都没有返回Future,这意味着无论您在做什么,无法正常工作。请先解决这个问题,然后测试您的问题是否已经解决,如果问题仍然存在,请发布您的更新代码和一个好的、逐步的问题描述。
  • @nvoigt 好的,我这样做。非常感谢!
  • 另外,由于您没有从 loadUser() 保存 Future 或自己使用 setState,您的函数可能会运行,但不会显示任何结果,因为您的构建不会再次运行。有关更多信息,请参阅stackoverflow.com/questions/63017280/…。
  • @nvoigt 是的,这正是问题所在。我想,我可以绕过 FutureBuilder。

标签: json flutter object sharedpreferences


【解决方案1】:

[已解决]

错误是转换错误。

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

感谢您的帮助!

【讨论】:

    【解决方案2】:

    这里:

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

    【讨论】:

    • 没有。 getString 返回 String,而不是 Future。否则它不会编译。
    猜你喜欢
    • 1970-01-01
    • 2016-01-13
    • 2020-07-10
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多