json - 如何使用存储在 FutureBuilder 的 snapshot.data(无类)中的 JSON 数据?
问题描述
return loading ? Loading() : FutureBuilder(
future: SaadConstants.getJsonLanguagePack(),// edit pls
builder: (BuildContext context, AsyncSnapshot snapshot)
{
if (snapshot.connectionState == ConnectionState.waiting) {
return Center(child: CircularProgressIndicator());
}
// rest of code
我的 getJsonLanguagePack():
static Future<String > getJsonLanguagePack() async {
SharedPreferences pref = await SharedPreferences.getInstance();
return json.decode(pref.getString('languagePack')); // languagePack Exists as String already locally containing all the json file content (local json file)
}
我的 JSON 文件:
[
{"key":"registerNew", "value":"Nouveau ?" },
{"key":"emailPlaceHolder", "value":"Entrez votre email." },
{"key":"passwordPlaceHolder", "value":"Entrez votre mot de pass." },
{"key":"rememberMe", "value":"rester connecté." },
{"key":"forgotPass", "value":"Pass oublié ?" },
{"key":"loginBtn", "value":"Connexion" },
{"key":"_or_", "value":"_OU_" }]
我试图在我的 getJsonLanguagePack 上返回 Future> 但它在 FutureBuilder 内部引发了一个错误,说 String 不是 Map 的子类型
问题是当我尝试访问 snapshot.data 时。我不能使用我在 JSON 文件中定义的键来获取我想要的值。
因为它被调和为字符数组。
非常感谢 。
解决方案
您不必将 json 文件数据复制到SharePreference
. 你可以直接使用它们
import 'dart:convert';
import "package:flutter/material.dart";
import 'package:flutter/services.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
home: HomePage(),
);
}
}
class HomePage extends StatelessWidget {
static Future<Map<String, String>> loadJsonLanguage(String langName) async {
final jsonString = await rootBundle
.loadString('assets/app_languages/' + langName + '.json');
List translationList = jsonDecode(jsonString);
final mappedTranslation = <String, String>{};
translationList.forEach((dynamic item) {
mappedTranslation[item["key"]] = item["value"];
});
return mappedTranslation;
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: FutureBuilder(
future: loadJsonLanguage("ar"),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting)
return Center(child: CircularProgressIndicator());
else if (snapshot.hasError)
return Center(child: Text("${snapshot.error}"));
return Center(child: Text(snapshot.data["registerNew"]));
},
),
);
}
}
推荐阅读
- tvos - 是否可以让我的应用程序在 Apple TV 启动时启动?
- c++ - 组合值和键以形成 json 对象
- react-native - 在中继optimisticUpdater中迭代存储
- angular - 无法调用其类型缺少调用签名的表达式。类型 'typeof import("sweetalert2")' 没有兼容的调用签名
- python - 循环遍历多个 CSV 文件并运行脚本
- java - 我们可以对应用程序进行编程以自行重启吗?
- python - 如果查询集包含django中的数据,如何根据相关对象过滤查询集
- mysql - MySQL 将时间显示为文本
- magento - 管理员菜单不会滑出,配置菜单也不会打开。按钮也不起作用
- c# - 碰撞的统一问题-特定碰撞后碰撞不起作用