тип «_InternalLinkedHashMap» не является подтипом типа «Карта» в приведенном типе

#flutter #dart #casting #type-conversion

Вопрос:

Я не могу бросить а Map<String, dynamic> в а Map<String, Map<String, String> . Каков наилучший способ сделать это?

Обратите внимание, что я использую расширенные параметры анализа в своем analysis_options.yaml :

 analyzer:
  enable-experiment:
    - extension-methods
  strong-mode:
    implicit-casts: false
    implicit-dynamic: false
 

Я пытался

 var de = Map<String, Map<String, String>>.from((json.decode(await rootBundle.loadString('lang/de.json'))) as Map<String, dynamic>);
 

и

 var de = (json.decode(await rootBundle.loadString('lang/de.json')) as Map<String, dynamic>).cast<String, Map<String, String>>();
 

и

 var de = Map.castFrom<String, dynamic, String, Map<String, String>>((json.decode(await rootBundle.loadString('lang/de.json'))) as Map<String, dynamic>);
 

Все попытки вызвали следующую ошибку во время выполнения: type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'Map<String, String>' in type cast

Каков наилучший способ для этого? Я думаю, что это можно сделать, пройдясь по карте, но если они очень большие, это дорогостоящая операция. Есть ли какой-нибудь способ разыграть их без повторения?

Ответ №1:

Я не верю, что существует способ приведения к соответствующему типу при работе с вложенными данными, подобными этому.

Здесь была аналогичная дискуссия о приведении вложенных списков: https://github.com/dart-lang/language/issues/1574

Я думаю, что повторение данных каким-то образом-это единственное, что вы можете сделать в этой ситуации.

Одно из возможных решений:

 final data = await rootBundle.loadString('lang/de.json');
final Map<String, Map<String, String>> de = {
  for (final entry in (json.decode(data) as Map).entries)
    entry.key as String: {
      for (final e in (entry.value as Map).entries)
        e.key as String: e.value as String,
    },
};
 

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

1. Спасибо за ваш ответ! Жаль, что dart не предоставляет для этого никаких лучших инструментов. Эти накладные расходы на огромное количество кода и производительность во время выполнения огромны. Поэтому я думаю, что отключу расширенные параметры анализа, чтобы избежать этих вещей. Похоже, это компромисс: производительность по сравнению с качеством кода.