#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 есть некоторые опечатки. Спасибо.