Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 颤振:保存列表<;动态>;从Json.encode共享数据引用_Flutter_Dart - Fatal编程技术网

Flutter 颤振:保存列表<;动态>;从Json.encode共享数据引用

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

我想将API中的AppInfo信息保存到SharedReferences中。我有源代码和结果JSON如下:

应用程序信息API.dart:

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