Flutter: тип аргумента ‘dynamic’ не может быть присвоен типу параметра ‘Map’

#flutter #dart

#трепетание #dart

Вопрос:

Предположим, у меня есть объект json, подобный этому:

 {
 "sort": "asc",
 "page": {
    "next": "asdfg",
    "prev": "kljekj"
 }
}
 

Я написал модель данных в dart следующим образом:

 class AllPage{
 String sort;
 Page page;

 AllPage({this.sort, this.page});

 AllPage.fromJson(Map<String, dynamic> json) {
   return AllPage(
     sort = json['sort'],
     page = Page.fromJson(json['page']));
 }
}

class Page {
 String next;
 String prev;

 Page({this.next, this.prev});

 Page.fromJson(Map<String, dynamic> json) {
  return Page(
    next = json['next'],
    prev = json['prev']);
 }
}
 

Я видел бесчисленное множество примеров, в которых это работает. Однако я получаю сообщение об ошибке в моем классе AppPage, внутри страницы.FromJSON(json[‘страница’]).
Ошибка гласит: «Тип аргумента «динамический» не может быть присвоен типу параметра «Карта>строка, динамический>».

Я новичок в flutter / dart. Так что это может быть что-то простое, чего мне не хватает. Любая помощь приветствуется. Спасибо!

Ответ №1:

json['page'] возвращает динамическое значение, поскольку оно может быть действительно любым. Вам нужно выполнить некоторое приведение

 class AllPage {
  String sort;
  Page page;

  AllPage({this.sort, this.page});

  factory AllPage.fromJson(Map<String, dynamic> json) {
    return AllPage(
      sort: json['sort'].toString(),
      page: Page.fromJson(json['page'] as Map),
    );
  }
}

class Page {
  String next;
  String prev;

  Page({this.next, this.prev});

  factory Page.fromJson(Map json) {
    return Page(
      next: json['next'].toString(),
      prev: json['prev'].toString(),
    );
  }
}
 

Обратите внимание, что он многое предполагает о структуре json. Вы должны добавить проверки, например, что, если json['page'] или json['next'] равно нулю.

Также исправлены некоторые проблемы с компиляцией, связанные с использованием конструкторов

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

1. Это избавило от ошибки. Я отмечу ответ, как только у меня будет возможность проверить это. Но, похоже, это исправляет проблему. Спасибо!