Flutter 颤振:保存列表<;动态>;从Json.encode共享数据引用
我想将API中的AppInfo信息保存到SharedReferences中。我有源代码和结果JSON如下: 应用程序信息API.dart:Flutter 颤振:保存列表<;动态>;从Json.encode共享数据引用,flutter,dart,Flutter,Dart,我想将API中的AppInfo信息保存到SharedReferences中。我有源代码和结果JSON如下: 应用程序信息API.dart: Future<List> getAppInfo() async { try { final response = await http.get( "${appConfig.baseApiUrl}/${appConfig.appInfoController}/getLogoClient");
Future<List> getAppInfo() async {
try {
final response = await http.get(
"${appConfig.baseApiUrl}/${appConfig.appInfoController}/getLogoClient");
final Map<String, dynamic> responseJson = json.decode(response.body);
if (responseJson["status"] == "ok") {
List appInfoList = responseJson["data"];
print('List Dynamic From API : $appInfoList ');
return appInfoList;
} else {
throw CustomError(responseJson["message"]);
}
} catch (e) {
return Future.error(e.toString());
}
}
我已经阅读了有关可以存储在SharedReferences
中的类型数据的文档,发现可以存储为List[String]
。问题是上面的appInfoList返回的是List[dynamic]
,它可以从List[dynamic]
转换为List[String]
,所以我可以将它添加到SharedReferences
我的实验
我遵循这一点并尝试实施它
我创建GlobalProvider
来存储API中的值
class GlobalProvider extends ChangeNotifier {
static const _APP_INFO_LIST123 = "appInfoList123";
GlobalProvider() {
syncDataWithProvider();
}
List<AppInfoModel> appInfoList123 = [];
Future updateSharedPreferencesAppInfo123(List<dynamic> value) async {
List<String> myAppInfoList123 = value.map((e) => json.encode(e)).toList();
SharedPreferences prefs = await SharedPreferences.getInstance();
final result =
await prefs.setStringList(_APP_INFO_LIST123, myAppInfoList123);
print('result from updateSP $result');
print('Myappinfolist123 : $myAppInfoList123');
}
Future syncDataWithProvider() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
var result = prefs.getStringList(_APP_INFO_LIST123);
print('The Result is $result');
if (result != null) {
appInfoList123 = result
.map<AppInfoModel>((e) => AppInfoModel.fromJson(json.decode(e)))
.toList();
}
print('Hore $appInfoList123');
notifyListeners();
}
}
你确实犯了一个错误。在读取数据时,您需要使用或其他方法等待。因为
syncDataWithProvider
是异步调用。这意味着在执行完成时它不会阻塞当前线程
class GlobalProvider扩展了ChangeNotifier{
静态常量APP INFO LIST123=“appInfoList123”;
GlobalProvider(){
future=syncDataWithProvider();
}
列表appInfoList123=[];
未来;
Fure UpdateSharedReferencesAppInfo123(列表值)异步{
List myAppInfoList123=value.map((e)=>json.encode(e)).toList();
SharedReferences prefs=等待SharedReferences.getInstance();
最终结果=等待prefs.setStringList(_APP_INFO_LIST123,myAppInfoList123);
打印('result from updateSP$result');
打印('Myappinfolist123:$Myappinfolist123');
}
未来syncDataWithProvider()异步{
SharedReferences prefs=等待SharedReferences.getInstance();
var result=prefs.getStringList(\u APP\u INFO\u LIST123);
打印(“结果为$Result”);
如果(结果!=null){
appInfoList123=结果
.map((e)=>AppInfoModel.fromJson(json.decode(e)))
.toList();
}
打印('Hore$appInfoList123');
notifyListeners();
}
}
还有你的看法
返回FutureBuilder(
未来:globalProvider.future,
生成器:(上下文,快照){
如果(!snapshot.hasData){
返回文本('加载…');
}
返回脚手架(
正文:中(
子项:文本(globalProvider.appInfoList123[0].fileInfo),
),
)
}
);
您是否尝试过json.encode
ing编写和json.deocde
ing阅读?@MisirJafarov是的,我已经尝试过了。问题是,当我在splashscreen中访问它时,会出现如上所述的错误,但奇怪的是,如果我再次刷新,错误仍然显示,但值showfyi:与某些语言不同,dart json解码器将json对象转换为映射而不是直接映射到对象。所以您需要将每个属性映射到您自己的类。@MisirJafarov在我的GlobalProvider函数syncDataWithProvider中,我已经映射了每个属性。如果我错了,请纠正我。请检查我的答案
class GlobalProvider extends ChangeNotifier {
static const _APP_INFO_LIST123 = "appInfoList123";
GlobalProvider() {
syncDataWithProvider();
}
List<AppInfoModel> appInfoList123 = [];
Future updateSharedPreferencesAppInfo123(List<dynamic> value) async {
List<String> myAppInfoList123 = value.map((e) => json.encode(e)).toList();
SharedPreferences prefs = await SharedPreferences.getInstance();
final result =
await prefs.setStringList(_APP_INFO_LIST123, myAppInfoList123);
print('result from updateSP $result');
print('Myappinfolist123 : $myAppInfoList123');
}
Future syncDataWithProvider() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
var result = prefs.getStringList(_APP_INFO_LIST123);
print('The Result is $result');
if (result != null) {
appInfoList123 = result
.map<AppInfoModel>((e) => AppInfoModel.fromJson(json.decode(e)))
.toList();
}
print('Hore $appInfoList123');
notifyListeners();
}
}
class _SplashScreenState extends State<SplashScreen> {
GlobalProvider globalProvider;
@override
void didChangeDependencies() {
super.didChangeDependencies();
globalProvider = Provider.of<GlobalProvider>(context);
testing(globalProvider);
}
testing(GlobalProvider gp) async {
final appInfoList = appInfoApi.getAppInfo();
final result = await appInfoList;
print('Hello List Dynamic From didChangeDependecies : $result');
return await gp.updateSharedPreferencesAppInfo123(result);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(child: Text(globalProvider.appInfoList123[0].fileInfo)), <!!! IN HERE
);
}
}
I/flutter (26131): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter (26131): The following RangeError was thrown building SplashScreen(dirty, dependencies:
I/flutter (26131): [_DefaultInheritedProviderScope<GlobalProvider>], state: _SplashScreenState#a10e3):
I/flutter (26131): RangeError (index): Invalid value: Valid value range is empty: 0
I/flutter (26131):
I/flutter (26131): The relevant error-causing widget was:
I/flutter (26131): SplashScreen
lib\main.dart:42
I/flutter (26131):
I/flutter (26131): When the exception was thrown, this was the stack:
I/flutter (26131): #0 List.[] (dart:core-patch/growable_array.dart:146:60)
I/flutter (26131): #1 _SplashScreenState.build
package:klenger_burger_app/screens/splash_screen.dart:88
I/flutter (26131): #2 StatefulElement.build
package:flutter/…/widgets/framework.dart:4590
I/flutter (26131): #3 ComponentElement.performRebuild
package:flutter/…/widgets/framework.dart:4478
I/flutter (26131): #4 StatefulElement.performRebuild
package:flutter/…/widgets/framework.dart:4646
I/flutter (26131): #5 Element.rebuild
package:flutter/…/widgets/framework.dart:4202
I/flutter (26131): #6 ComponentElement._firstBuild
package:flutter/…/widgets/framework.dart:4461
I/flutter (26131): #7 StatefulElement._firstBuild
package:flutter/…/widgets/framework.dart:4637
I/flutter (26131): #8 ComponentElement.mount
package:flutter/…/widgets/framework.dart:4456
I/flutter (26131): ... Normal element mounting (115 frames)
I/flutter (26131): #123 Element.inflateWidget
package:flutter/…/widgets/framework.dart:3430
I/flutter (26131): #124 MultiChildRenderObjectElement.mount
package:flutter/…/widgets/framework.dart:5857
I/flutter (26131): ... Normal element mounting (253 frames)
I/flutter (26131): #377 Element.inflateWidget
package:flutter/…/widgets/framework.dart:3430
I/flutter (26131): #378 Element.updateChild
package:flutter/…/widgets/framework.dart:3198
I/flutter (26131): #379 ComponentElement.performRebuild
package:flutter/…/widgets/framework.dart:4498
I/flutter (26131): #380 _InheritedProviderScopeMixin.performRebuild
package:provider/src/inherited_provider.dart:220
I/flutter (26131): #381 Element.rebuild
package:flutter/…/widgets/framework.dart:4202
I/flutter (26131): #382 ComponentElement._firstBuild
package:flutter/…/widgets/framework.dart:4461
I/flutter (26131): #383 ComponentElement.mount
package:flutter/…/widgets/framework.dart:4456
I/flutter (26131): ... Normal element mounting (7 frames)
I/flutter (26131): #390 SingleChildWidgetElementMixin.mount
package:nested/nested.dart:223
I/flutter (26131): ... Normal element mounting (7 frames)
I/flutter (26131): #397 _NestedHookElement.mount
package:nested/nested.dart:188
I/flutter (26131): ... Normal element mounting (7 frames)
I/flutter (26131): #404 SingleChildWidgetElementMixin.mount
package:nested/nested.dart:223
I/flutter (26131): #405 Element.inflateWidget
package:flutter/…/widgets/framework.dart:3430
I/flutter (26131): #406 Element.updateChild
package:flutter/…/widgets/framework.dart:3198
I/flutter (26131): #407 RenderObjectToWidgetElement._rebuild
package:flutter/…/widgets/binding.dart:1142
I/flutter (26131): #408 RenderObjectToWidgetElement.mount
package:flutter/…/widgets/binding.dart:1113
I/flutter (26131): #409 RenderObjectToWidgetAdapter.attachToRenderTree.<anonymous closure>
package:flutter/…/widgets/binding.dart:1055
I/flutter (26131): #410 BuildOwner.buildScope
package:flutter/…/widgets/framework.dart:2591
I/flutter (26131): #411 RenderObjectToWidgetAdapter.attachToRenderTree
package:flutter/…/widgets/binding.dart:1054
I/flutter (26131): #412 WidgetsBinding.attachRootWidget
package:flutter/…/widgets/binding.dart:935
I/flutter (26131): #413 WidgetsBinding.scheduleAttachRootWidget.<anonymous closure>
package:flutter/…/widgets/binding.dart:917
I/flutter (26131): (elided 11 frames from class _RawReceivePortImpl, class _Timer, dart:async, and dart:async-patch)
I/flutter (26131):
I/flutter (26131): ════════════════════════════════════════════════════════════════════════════════════════════════════
class AppInfoModel {
String kodeInfo;
String namaInfo;
String keteranganInfo;
String fileInfo;
String logoInfo;
String loginBackgroundInfo;
String loginLeftInfo;
String loginSupportInfo;
String createBy;
String createTime;
String updateBy;
DateTime updateTime;
AppInfoModel({
this.kodeInfo,
this.namaInfo,
this.keteranganInfo,
this.fileInfo,
this.logoInfo,
this.loginBackgroundInfo,
this.loginLeftInfo,
this.loginSupportInfo,
this.createBy,
this.createTime,
this.updateBy,
this.updateTime,
});
factory AppInfoModel.fromJson(Map<String, dynamic> json) => AppInfoModel(
kodeInfo: json["kodeInfo"] == null ? '' : json["kodeInfo"],
namaInfo: json["namaInfo"] == null ? '' : json["namaInfo"],
keteranganInfo:
json["keteranganInfo"] == null ? '' : json["keteranganInfo"],
fileInfo: json["fileInfo"] == null ? '' : json["fileInfo"],
logoInfo: json["logoInfo"] == null ? '' : json["logoInfo"],
loginBackgroundInfo: json["loginBackgroundInfo"] == null
? ''
: json["loginBackgroundInfo"],
loginLeftInfo:
json["loginLeftInfo"] == null ? '' : json["loginLeftInfo"],
loginSupportInfo:
json["loginSupportInfo"] == null ? '' : json["loginSupportInfo"],
createBy: json["createBy"] == null ? '' : json["createBy"],
createTime: json["createTime"] == null ? '' : json["createTime"],
updateBy: json["updateBy"] == null ? '' : json["updateBy"],
updateTime: DateTime.parse(json["updateTime"]) == null
? ''
: DateTime.parse(json["updateTime"]),
);
Map toJson() => {
'kodeInfo': this.kodeInfo,
'namaInfo': this.namaInfo,
'keteranganInfo': this.keteranganInfo,
'fileInfo': this.fileInfo,
'logoInfo': this.logoInfo,
'loginBackgroundInfo': this.loginBackgroundInfo,
'loginLeftInfo': this.loginLeftInfo,
'loginSupportInfo': this.loginSupportInfo,
'createBy': this.createBy,
'createTime': this.createTime,
'updateBy': this.updateBy,
'updateTime': this.updateTime,
};
}
final appInfoModel = AppInfoModel();