gpt4 book ai didi

json - 如何在flutter本地化中读取嵌套的json?

转载 作者:行者123 更新时间:2023-12-03 17:02:39 30 4
gpt4 key购买 nike

我是 flutter 的新手。

我在我的 flutter 项目中应用了本地化,一切正常,直到我编辑我的 json 语言文件以具有嵌套对象。

如何正确调用嵌套的json对象?

我尝试使用点来调用它,但它抛出错误“必须提供非空字符串...”

AppLocalizations.of(context).translate('Intro.Header')

这是我的 json
{
"Intro": {
"Header": "Introduction",
"Content": "This is...."
},
"Test": "This is test",
}

如果我直接调用“测试”,我没有问题。
AppLocalizations.of(context).translate('Test')

如何阅读标题和内容?

最佳答案

我知道这个问题已经很老了,但我发现它是因为我遇到了同样的问题并且正在寻找解决方案。我无法在互联网上找到一个,所以我试图自己解决它,当我完成它时,我想在这里展示我的解决方案。这个解决方案可能不是最好的解决方案,因为我对 Dart/Flutter 还很陌生,但至少它是有效的。

由于问题的所有者没有提供他的设置,我将采用此 Video 的状态如给定。

[...] 
Map<String, String> _localizeStrings;
[...]
_localizeStrings = jsonMap.map((key, value) {
return MapEntry(key, value.toString());
});
[...]
String translate(String key) {
return _localizeStrings[key];
}
[...]

这就是给定的状态,它完全是为平面 json 结构设置的。为了能够使用嵌套结构,我们的 Map _localizeStrings应该是 Map<String, dynamic> 类型因为键将始终是一个字符串,但值可以是一个字符串或另一个映射。作为下一步,我们需要删除 .toString()来自 value .作为最后一步,我们将实现一个函数,该函数通过“.”分割给定的键。并且会一键爬下 map 。它得到的最后一个值我们将返回 .toString()因为这应该是我们想要的字符串。

所以这是我的解决方案:
import 'dart:async';
import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

class AppLocalizations {
final Locale locale;
static const LocalizationsDelegate<AppLocalizations> delegate =
_AppLocalizationsDelegate();

AppLocalizations(this.locale);

static AppLocalizations of(BuildContext context) {
return Localizations.of<AppLocalizations>(context, AppLocalizations);
}

Map<String, dynamic> _localizeStrings;

Future<bool> load() async {
String jsonString =
await rootBundle.loadString('lang/${locale.languageCode}.json');
Map<String, dynamic> jsonMap = json.decode(jsonString);

_localizeStrings = jsonMap.map((key, value) {
return MapEntry(key, value);
});

return true;
}

String translate(String key) {
var nestedMap = _getNestedValue(key);
return nestedMap.toString();
}

dynamic _getNestedValue(String keyPath) {
Map keyMap = keyPath.split('.').asMap();
var nestedMap;
keyMap.forEach((index, key) {
if (index == 0) {
nestedMap = _localizeStrings[key];
} else
nestedMap = nestedMap[key];
});
return nestedMap;
}
}

class _AppLocalizationsDelegate
extends LocalizationsDelegate<AppLocalizations> {
const _AppLocalizationsDelegate();

@override
bool isSupported(Locale locale) {
return ['en', 'de'].contains(locale.languageCode);
}

@override
Future<AppLocalizations> load(Locale locale) async {
AppLocalizations localizations = new AppLocalizations(locale);
await localizations.load();
return localizations;
}

@override
bool shouldReload(LocalizationsDelegate<AppLocalizations> old) => false;
}

关于json - 如何在flutter本地化中读取嵌套的json?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57323681/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com