У вас проблемы с тем, что вы боретесь против системы типов в Dart. Как вы обнаружили, в runtimeType есть что-то, что автоматически присваивается другому типу, кроме dynamic
.
. Я создал этот пример, который работает:
Map fixprobset(Map<dynamic, dynamic> P) {
print(P);
if (!P.containsKey("name")) {
final foo = (P["tileset"] as List).join(" ");
P["name"] = foo;
}
if (P.containsKey("children")) {
for (var k = 0; k < (P["children"] as List).length; k++) {
fixprobset((P["children"] as List)[k] as Map);
}
}
return P;
}
void main() {
final problemset = fixprobset(<dynamic, dynamic>{
"name": "Jingle Jangle",
"children": <dynamic>[
<dynamic, dynamic>{
"tileset": <dynamic>["1", "2", "3"]
}
]
});
print(problemset);
}
Как Вы можете видеть, что автоматически назначенные типы поступают из ваших входных данных, которые получают назначенные типы, что имеет смысл в начале программы. Ваша проблема в том, что вы не хотите автоматически назначать типы, но хотите изменить их после создания. Итак, вы хотите изменить List<String>
на List<dynamic>
, но для этого вам нужно создать новый объект, поскольку вы не можете изменить тип объекта после его создания.
Так что мое "решение" исправляет это, устанавливая тип во время создания списков и карт на входе первого вызова в fixprobset
.