[英]Dart: Can't access to nested map object
我正在创建 Flutter 应用程序,但无法访问dart
嵌套地图对象。 我的代码如下。
Map<String, String> _localizedValues;
Future<bool> load() async {
// Load a language JSON file from the 'i18n' folder
String value = await rootBundle.loadString('i18n/${locale.languageCode}.json');
Map<String, dynamic> jsonMap = jsonDecode(value);
_localizedValues = jsonMap.map((key, value) {
return MapEntry(key, value.toString());
});
return true;
}
String translate(String parent, String key) {
// Returns a localized text
return _localizedValues[parent][key];
}
和错误发生[key]
这部分。 它说
不能将参数类型“String”分配给参数类型“int”。
JSON 文件是这样的。
{
"Parent": {
"key": "key"
}
}
我有什么问题吗?
我将为这个问题提出一个不同的解决方案,它可能更容易让你使用。 在使用它之前,您可以简单地展平多维 json 对象。
Map<String, String> _localizedValues;
Map flattenTranslations(Map<String, dynamic> json, [String prefix = '']) {
final Map<String, String> translations = {};
json.forEach((String key, dynamic value) {
if (value is Map) {
translations.addAll(flattenTranslations(value, '$prefix$key.'));
} else {
translations['$prefix$key'] = value.toString();
}
});
return translations;
}
Future<bool> load() async {
// Load a language JSON file from the 'i18n' folder
String value = await rootBundle.loadString('i18n/${locale.languageCode}.json');
Map<String, dynamic> jsonMap = jsonDecode(value);
_localizedValues = flattenTranslations(jsonMap);
return true;
}
您将获得一个简单的 Map 对象,该对象将包含 json 的所有键,每个子树键都以其父键为前缀。
例如:
{
"Parent": {
"key": "key",
"key1": "key",
"key2": "key",
"key3": "key",
"someOtherKey": {
"key213": "keyeye",
"oneMoreLevel": {
"key123412": "asdasdasd"
}
}
}
}
将转换为包含“Parent.someOtherKey.oneMoreLevel.key123412”键的地图。 在此之后,您可以使用此功能来获取翻译:
String translate(String key) {
// Returns a localized text or KEY if there's no localization
return _localizedValues[key] ?? key;
}
print(translate('Parent.someOtherKey.oneMoreLevel.key123412'));
查看您的数据格式:
{
"Parent": {
"key": "key"
}
}
例如,它应该是这样的:
{"a": {"a": "4"}, "b": {"b": "5"}}
这行你在做什么: MapEntry(key, value.toString());
是,您正在将内部映射 ( {"a": "4"}
) 转换为String
。 这就是您看到该错误的原因。
尝试从MapEntry(key, value.toString())
删除.toString()
MapEntry(key, value.toString())
。
如果这不起作用,请告诉我。
_localizedValues = jsonMap.forEach((key, value) {
return MapEntry(key, value.toString());
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.