AhW*_*gih 6 arrays json dart flutter
我正在尝试将城市名称数组添加到我的本地化 json 文件中,但在将其转换为字符串后无法将其解码回数组。
en-US.json
{
"title" : "My account",
"name" : "John",
"cities" : ["Paris", "Lyon", "Nice"]
}
Run Code Online (Sandbox Code Playgroud)
应用程序本地化.dart
class AppLocalizations {
final Locale locale;
AppLocalizations(this.locale);
static AppLocalizations of(BuildContext context) {
return Localizations.of<AppLocalizations>(context, AppLocalizations);
}
static const LocalizationsDelegate<AppLocalizations> delegate =
_AppLocalizationsDelegate();
Map<String, String> _localizationStrings;
Future<bool> load() async {
String jsonString = await rootBundle.loadString(
'assets/translations/${locale.languageCode}-${locale.countryCode}.json');
Map<String, dynamic> jsonMap = json.decode(jsonString);
_localizationStrings = jsonMap.map((key, value) {
return MapEntry(key, value.toString());
});
return true;
}
Future<void> setLocale(Locale locale) async {
final SharedPreferences _prefs = await SharedPreferences.getInstance();
final _languageCode = locale.languageCode;
await _prefs.setString('locale', _languageCode);
print('locale saved!');
}
static Future<Locale> getLocale() async {
final SharedPreferences _prefs = await SharedPreferences.getInstance();
final String _languageCode = _prefs.getString('locale');
if (_languageCode == null) return null;
Locale _locale;
_languageCode == 'en'
? _locale = Locale('en', 'US')
: _locale = Locale('ar', 'EG');
return _locale;
}
String translate(String key) {
return _localizationStrings[key];
}
}
class _AppLocalizationsDelegate
extends LocalizationsDelegate<AppLocalizations> {
const _AppLocalizationsDelegate();
@override
bool isSupported(Locale locale) {
return ['en', 'ar'].contains(locale.languageCode);
}
@override
Future<AppLocalizations> load(Locale locale) async {
AppLocalizations localization = AppLocalizations(locale);
await localization.load();
return localization;
}
@override
bool shouldReload(LocalizationsDelegate<AppLocalizations> old) {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
在我的小部件中,我尝试通过访问数组List<String> _cities = AppLocalization.of(context).translate('cities');
这是有效的,如果我打印 _cities.toString() 它会打印 [Paris, Lyon, Nice]。
问题
当我尝试使用将 _cities 解码为数组时,json.decode(_cities)我总是收到格式错误 Unhandled Exception: FormatException: Unexpected character (at character 2)。
我相信在这个函数中数组被转换为字符串
_localizationStrings = jsonMap.map((key, value) {
return MapEntry(key, value.toString());
});
Run Code Online (Sandbox Code Playgroud)
我怎样才能将它解析回数组?
我愿意接受各种建议。谢谢
如果您想以数组形式访问本地化数据,请勿将数组展平为字符串。根据您的用例,无论如何将此类数据存储在本地化文件中可能并不合适。
但是,如果您仍然想将列表存储在本地化文件中,那么我建议您不要展平解码的 json 映射并返回动态值而不是来自translate. 当您检索本地化值时,您必须将其类型转换为您期望的类型,因此您可能需要添加一些辅助函数(见下文)以使其干燥一些。
import 'dart:convert';
var cities = '''
{
\"cities\" : [\"Paris\", \"Lyon\", \"Nice\"]
}
''';
class Localization {
final Map<String,dynamic> data;
Localization(this.data);
String localizedString(String key) {
return data[key] as String;
}
List<String> localizedList(String key) {
return List<String>.from(data[key]);
}
}
void main(){
var data = jsonDecode(cities); // jsonDecode(cities);
var l = Localization(data);
for(var city in l.localizedList("cities")) {
print("$city");
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2523 次 |
| 最近记录: |