当前位置: 首页 > 知识库问答 >
问题:

flatter-json_serializable fromJson:null调用了方法“[]”

章海
2023-03-14

在我的应用程序中,我将数据导出到JSON。但是,当我尝试导入JSON文件时,它会抛出一个错误,如下所示:

E/flatter:[错误:flatter/shell/common/shell.cc(184)]省道错误:未处理的异常:NoSuchMethodError:对null调用了方法“[]”。接收方:null尝试调用:#0对象。noSuchMethod(dart:core/runtime/libobject_patch.dart:50:5)#1$RecipesModelFromJson(file:///home/stube/IdeaProjects/Flutter_Recipe/lib/JSON/recipes.g.dart:11:11)#2个新模式。fromJson(包:Time2Eat/JSON/recipes.dart:20:63)#3$RecipesModelFromJson(file:///home/stube/IdeaProjects/Flutter_Recipe/lib/JSON/recipes.g.dart:32:22)#4种新型配方。fromJson(包:Time2Eat/JSON/recipes.dart:20:63)#5 RecipebookState。创建RecipeJSON(包:Time2Eat/recipe/recipebook.dart:111:32)#6 RecipebookState。getPath(包:Time2Eat/recipe/recipebook.dart:123:9)#7 RecipebookState。建筑(包装:Time2Eat/recipe/recipebook.dart:185:19)#8动画儿童_表演(套装:颤振、速度、拨号、src、动画、儿童、飞镖:60:24)9_把手(包装:颤振/src/材料/墨水井。省道:507:14)#10#。建筑(包装:颤振/src/material/ink_well.省道:562:30)#11手势识别器。invokeCallback(包:flatter/src/signatures/recognizer.dart:102:24)#12 TapGestureCongnizer_检查(程序包:颤振/src/signatures/tap.dart:242:9)#13 TapGestureRecognizer。handlePrimaryPointer(软件包:flatter/src/signatures/tap.dart:175:7)#14 PrimaryPointer检测识别器。handleEvent(套装:颤振/src/手势/识别器。省道:315:9)#15点外部_调度(包:颤振/src/手势/指针路由器。dart:73:12)#16点路由器。路线(包:颤振/src/signatures/pointer_router.dart:101:11)#17_WidgetsFlutterBinding

recipes.g.dart,这是由json_serializable产生的:

// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************

RecipesModel _$RecipesModelFromJson(Map<String, dynamic> json) {
  return RecipesModel(
      json['name'] as String,
      json['image'] as String,
      json['description'] as String,
      json['favorite'] as int,
      json['timestamp'] as String,
      json['preperation'] as String,
      json['creation'] as String,
      json['resting'] as String,
      json['people'] as String,
      json['backgroundColor'] as String,
      (json['zutaten'] as List)
          ?.map((e) => e == null
              ? null
              : ZutatenModel.fromJson(e as Map<String, dynamic>))
          ?.toList(),
      (json['zubereitung'] as List)
          ?.map((e) => e == null
              ? null
              : ZubereitungModel.fromJson(e as Map<String, dynamic>))
          ?.toList())
    ..recipeModel =
        RecipesModel.fromJson(json['recipeModel'] as Map<String, dynamic>);
}

Map<String, dynamic> _$RecipesModelToJson(RecipesModel instance) =>
    <String, dynamic>{
      'name': instance.name,
      'image': instance.image,
      'description': instance.description,
      'favorite': instance.favorite,
      'timestamp': instance.timestamp,
      'preperation': instance.preperation,
      'creation': instance.creation,
      'resting': instance.resting,
      'people': instance.people,
      'backgroundColor': instance.backgroundColor,
      'zutaten': instance.zutaten,
      'zubereitung': instance.zubereitung,
      'recipeModel': instance.recipeModel
    };

ZutatenModel _$ZutatenModelFromJson(Map<String, dynamic> json) {
  return ZutatenModel(
      json['zutat'] as String,
      json['number'] as String,
      json['measure'] as String
  );
}

Map<String, dynamic> _$ZutatenModelToJson(ZutatenModel instance) =>
    <String, dynamic>{
      'zutat': instance.zutat,
      'number': instance.number,
      'measure': instance.measure
    };

ZubereitungModel _$ZubereitungModelFromJson(Map<String, dynamic> json) {
  return ZubereitungModel(json['number'] as String, json['steps'] as String);
}

Map<String, dynamic> _$ZubereitungModelToJson(ZubereitungModel instance) =>
    <String, dynamic>{'number': instance.number, 'steps': instance.steps};

我在一个函数中调用RecipeModel.fromJson()方法,它应该能够将这些数据保存在数据库中。功能看起来像这样:

createJson() async{
      FlutterDocumentPickerParams params = FlutterDocumentPickerParams(
          allowedFileExtensions: ['json'],
          invalidFileNameSymbols: ['/']
      );
      final path = await FlutterDocumentPicker.openDocument(params: params);
      File file = new File(path);
      createRecipeJson(file);
      Map<String,dynamic> jSON = json.decode(path.readAsStringSync());
      var model = RecipesModel.fromJson(jSON);
      showBottomSnack("Name: ${model.name}", ToastGravity.BOTTOM);
    }

我希望有人能帮我解决问题。那太棒了。

共有1个答案

郑功
2023-03-14

检查类成员中的@JsonSerializable(nullable: false)(从ZutatenModel和RecipeModel开始)。

如果希望它们有时为null,请不要在注释其模型类时标记null:false

如果是这种情况,请将其更改为@JsonSerializable(nullable:true)。顺便说一句,默认设置为true。

当一些类属性被提供null但是(nullable: false)向JsonSerializer建议这些属性不会为空时,通常会发生此异常。

 类似资料:
  • 我有一个完整的工作颤振平台插件和一个演示颤振应用程序。Flatter应用程序正在通过各种渠道与本机代码愉快地交谈,并获得响应。现在我需要该应用程序在后台工作。按照各种指南,我发现我需要在我的插件上调用。但如果我这么做,应用程序就会崩溃: ***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“[MyPlugin setPluginRegistrantC

  • 我正在从Flatter调用Firebase可调用函数,尽管我已经尝试了几乎所有的方法,但仍然无法处理可调用函数抛出的错误。 我的可调用函数如下所示: 然后,我在flatter中创建了一个Future来调用我的可调用函数: 最后,我用另一个错误处理程序从一个文本按钮调用我的未来: 当我调用我的函数并得到一个错误时,我的代码立即跳转到-并停止在-Flutter的(位于)。 它停在函数处的类,就在这里:

  • 这是一个线程,用于处理服务器端的输入和输出: 如果我调用print方法,线程就会被阻塞。这意味着“之前”是打印出来的,但“之后”永远不会到达。printwriter的CheckError方法返回false! 它位于一个AbstractServer中,由两个不同的服务器使用。第一个以前就已经使用过了,而且一直都没有问题(现在仍然如此)。另一个是新的,导致了这个问题。对于每个初始化的连接(两个具有不同

  • 所以我肯定有类似的东西在那里,但我已经搜索了一个小时,还没有找到确切的我要找的东西。假设我有一个这样的类: 我该如何制作这样的作品?

  • 问题内容: 我正在尝试模拟一个进行JNDI调用的私有方法。从单元测试中调用该方法时,它将引发异常^。我想模拟该方法用于测试目的。我使用了另一个问题answer中的示例代码,并且在测试通过时,似乎仍在调用底层方法。我在方法中插入,然后将其打印到控制台。 有趣的是,如果我将第一个注释掉,则测试通过。?:( 那么,我如何模拟出一个私有方法,使其不被调用? ^可以理解,由于我的工作空间不支持JNDI,因此

  • 问题内容: 因此,我敢肯定那里有类似的东西,但是我一直在寻找一个小时,却没有找到我真正想要的东西。说我有一堂课,看起来像这样: 我该如何做这样的工作? 问题答案: 使用Mockito,您可以像这样 监视真实对象 : 有一些陷阱,因此也请查看相关文档。