#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 не предоставляет для этого никаких лучших инструментов. Эти накладные расходы на огромное количество кода и производительность во время выполнения огромны. Поэтому я думаю, что отключу расширенные параметры анализа, чтобы избежать этих вещей. Похоже, это компромисс: производительность по сравнению с качеством кода.