android - Flutter - json_serializable fromJson:在 null 上调用了方法“[]”
问题描述
在我的应用程序中,我将数据导出到 JSON。但是当我尝试导入 JSON 文件时,它会引发如下所示的错误:
E/flutter: [ERROR:flutter/shell/common/shell.cc(184)] Dart 错误:未处理的异常:NoSuchMethodError:方法 '[]' 在 null 上被调用。接收者:null 尝试调用:#0 Object.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 new RecipesModel.fromJson (package:Time2Eat/JSON/recipes.dart:20:63) #3 _$RecipesModelFromJson (file:///home/stube/IdeaProjects/Flutter_Recipe/lib /JSON/recipes.g.dart:32:22) #4 new RecipesModel.fromJson (package:Time2Eat/JSON/recipes.dart:20:63) #5 RecipebookState.createRecipeJson (package:Time2Eat/recipe/recipebook.dart: 111:32) #6 食谱书状态。getPath (package:Time2Eat/recipe/recipebook.dart:123:9) #7 RecipebookState.build。(package:Time2Eat/recipe/recipebook.dart:185:19) #8 AnimatedChild._performAction (package:flutter_speed_dial/src/animated_child.dart:60:24) #9 _InkResponseState._handleTap (package:flutter/src/material/ink_well .dart:507:14) #10 _InkResponseState.build。(package:flutter/src/material/ink_well.dart:562:30) #11 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:102:24) #12 TapGestureRecognizer._checkUp (package:flutter/src /gestures/tap.dart:242:9) #13 TapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:175:7) #14 PrimaryPointerGestureRecognizer.handleEvent (package:
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};
我在函数内部调用RecipesModel.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);
}
我希望有人可以帮助我并解决我的问题。那将是真棒。
解决方案
检查@JsonSerializable(nullable: false)
您的班级成员(从 ZutatenModel 和 RecipeModel 开始)。
如果您希望它们null
有时会出现,请不要nullable: false
在注释它们的模型类时进行标记。
如果是这种情况,请将其更改为@JsonSerializable(nullable: true)
. 顺便说一句,它默认设置为 true。
此异常通常发生在提供了某些类属性null
但(nullable: false)
向 JsonSerializer 建议这些属性不会为空时。
推荐阅读
- makefile - 从源代码制作lftp时如何指定库路径
- python-3.x - FileNotFoundError: [Errno 2] No such file or directory ,即使我在文件夹中有图像
- mysql - 使用 bash 将多个 .csv 文件导入 mysql
- python - 如何从具有重复值的多个列表创建嵌套字典?
- nginx - Dotnet Core + Razor Pages + nginx 反向代理 + 隐藏 url 详细信息
- javascript - 如何修复“不是构造函数”
- validation - 当 otp 字段在颤振中为空时,如何向 otp 文件添加验证
- php - 如何过滤PHP中键的值?
- php - Why is this e-mail form using validation resulting in an error?
- applescript - 在 web 表单中输入值并使用 applescript 按下返回键