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); <<<<<<<<<<<<<
}
感谢帮助!
你好,我是 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); <<<<<<<<<<<<<
}
感谢帮助!