тип ‘_InternalLinkedHashMap’ не является подтипом типа ‘AssesmentModel?’

#flutter #dart

Вопрос:

Почему я получаю исключение ниже при вызове метода getAssesment ()?

Я пытаюсь установить _assesment = данные

 type '_InternalLinkedHashMaplt;String, dynamicgt;' is not a subtype of type 'AssesmentModel?'  

Это мои коды, модели (AssesmentModel и AreaModel) и поставщик (AssesmentProvider).

Модель оценки.дротик

 class AssesmentModel {  late int id;  late String observerName;  late String unit;  late AreaModel area;   AssesmentModel(  this.id,  this.observerName,  this.unit,  this.area,  );   AssesmentModel.fromJson(Maplt;String, dynamicgt; json) {  id = int.parse(json['id'].toString());  observerName = json['observerName'];  unit = json['unit'];  area = AreaModel.fromJson(json['area']);  }   Maplt;String, dynamicgt; toJson() {  return {  'id': id,  'observerName': observerName,  'unit': unit,  'area': area.toJson(),  };  } }  

Поставщик оценки.дротик

 class AssesmentFormProvider with ChangeNotifier {   AssesmentModel? _assesment;   AssesmentModel? get assesment =gt; _assesment;   set assesment(AssesmentModel? assesment) {  _assesment = assesment;  notifyListeners();  }    Futurelt;voidgt; getAssesment() async {  try {  // AssesmentModel assesment = await AssesmentService().readJson();  var response = await rootBundle.loadString('assets/json/assesment.json');  print('the response: '   response);   var data = json.decode(response);  print('assesment in provider');  print(data);   _assesment = data;  } catch (e) {  print(e);  }  } }  

Это моя модель области, которая относится к модели оценки

 class AreaModel {  late int id;  late String name;   AreaModel(  this.id,  this.name,  );   AreaModel.fromJson(Maplt;String, dynamicgt; json) {  id = int.parse(json['id'].toString());  name = json['name'];  }   Maplt;String, dynamicgt; toJson() {  return {  'id': id,  'name': name,  };  } }  

Спасибо вам за ответ. Очень признателен.

Комментарии:

1. можете ли вы AreaModel также включить?

2. @YeasinSheikh отредактировано

3. можете ли вы включить свой json, это поможет его протестировать.

4. @YeasinSheikh { «идентификатор»: 1, «имя наблюдателя»: «Даффи Джон», «единица измерения»: «Белаван — Нефтеперерабатывающий завод», «область»: { «идентификатор»: 1, «область»: «Область-1» } }

Ответ №1:

То, что вы получаете в ответе, на самом деле является json, и вы пытаетесь назначить json пользовательскому объекту. Вам нужно создать объект из данных ответа. Я вижу, что у вас уже есть метод .FromJSON в вашем классе AssestmentModel, так что вы можете просто;

 class AssesmentFormProvider with ChangeNotifier {   AssesmentModel? _assesment;   AssesmentModel? get assesment =gt; _assesment;   set assesment(AssesmentModel? assesment) {  _assesment = assesment;  notifyListeners();  }    Futurelt;voidgt; getAssesment() async {  try {  // AssesmentModel assesment = await AssesmentService().readJson();  var response = await rootBundle.loadString('assets/json/assesment.json');  print('the response: '   response);   var data = json.decode(response);  print('assesment in provider');  print(data); //you need to create an Assetsment Object and then assign it!  _assesment = AssetsmentModel.fromJson(data);  } catch (e) {  print(e);  }  } }  

а также вам необходимо изменить свой метод .FromJSON, чтобы вернуть объект оценки;

 class AssesmentModel {  late int id;  late String observerName;  late String unit;  late AreaModel area;    AssesmentModel(  this.id,  this.observerName,  this.unit,  this.area,  );    AssesmentModel.fromJson(Maplt;String, dynamicgt; json) {  return AssetsmentModel( id : int.parse(json['id'].toString()),  observerName : json['observerName'],  unit : json['unit'],  area : AreaModel.fromJson(json['area']) );    }    Maplt;String, dynamicgt; toJson() {  return {  'id': id,  'observerName': observerName,  'unit': unit,  'area': area.toJson(),  };  }  }  

Комментарии:

1. да, я забыл тип фабрики и вернул метод FromJSON, также неверный при инициализации _assesment. Спасибо

Ответ №2:

Есть несколько ошибок , таких как на синтаксическом анализаторе , как на AreaModel нет name , вместо этого он содержит area также некоторые ошибки опечатки, пройдите с этим кодом, и вы получите концепцию.

  class AreaModel {  final int id;  final String area;  AreaModel({  required this.id,  required this.area,  });   Maplt;String, dynamicgt; toMap() {  return {  'id': id,  'area': area,  };  }   factory AreaModel.fromMap(Maplt;String, dynamicgt; map) {  return AreaModel(  id: map['id'],  area: map['area'],  );  }   String toJson() =gt; json.encode(toMap());   factory AreaModel.fromJson(String source) =gt;  AreaModel.fromMap(json.decode(source)); }  class AssesmentModel {  final int id;  final String observer_name;  final String unit;  final AreaModel area;   AssesmentModel({  required this.id,  required this.observer_name,  required this.unit,  required this.area,  });   Maplt;String, dynamicgt; toMap() {  return {  'id': id,  'observer_name': observer_name,  'unit': unit,  'area': area.toMap(),  };  }   factory AssesmentModel.fromMap(Maplt;String, dynamicgt; map) {  return AssesmentModel(  id: map['id'],  observer_name: map['observer_name'],  unit: map['unit'],  area: AreaModel.fromMap(map['area']),  );  }   String toJson() =gt; json.encode(toMap());   factory AssesmentModel.fromJson(String source) =gt;  AssesmentModel.fromMap(json.decode(source)); }  main(Listlt;Stringgt; args) {  final jsonString =  '{ "id": 1, "observer_name": "Duffy Jhon", "unit": "Belawan - Refinery", "area": { "id": 1, "area": "Area-1" } }';   final m = AssesmentModel.fromMap(jsonDecode(jsonString));   print(m.id); }   

Комментарии:

1. да, я забыл тип фабрики и вернул метод FromJSON, и в моих свойствах данных json есть некоторые опечатки. Спасибо.