Json 如何使用存储在FutureBuilder';s snapshot.data(没有类)?
我的getJsonLanguagePack():Json 如何使用存储在FutureBuilder';s snapshot.data(没有类)?,json,flutter,Json,Flutter,我的getJsonLanguagePack(): return loading ? Loading() : FutureBuilder( future: SaadConstants.getJsonLanguagePack(),// edit pls builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.connectionState == Connecti
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
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)
}
我试图在getJsonLanguagePack上返回Future>
但它在FutureBuilder内部引发了一个错误,称字符串不是Map的子类型
问题是当我尝试访问snapshot.data时。我不能使用我在JSON文件中定义的键来获得我想要的值
因为它被调和成一系列的字符
非常感谢。您不必将json文件数据复制到
SharePreference
中。你可以直接使用它们
[
{"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_" }]
导入'dart:convert';
进口“包装:颤振/材料.省道”;
导入“包:flifter/services.dart”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
小部件构建(构建上下文){
返回材料PP(
主页:主页(),
);
}
}
类主页扩展了无状态小部件{
静态未来加载JSonLanguage(字符串langName)异步{
final jsonString=await rootBundle
.loadString('assets/app_languages/'+langName+'.json');
List translationList=jsonDecode(jsonString);
最终mappedTranslation={};
translationList.forEach((动态项){
mappedTranslation[项目[“键”]=项目[“值”];
});
返回地图翻译;
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:未来建设者(
未来:loadJsonLanguage(“ar”),
生成器:(上下文,快照){
if(snapshot.connectionState==connectionState.waiting)
返回中心(子项:CircularProgressIndicator());
else if(snapshot.hasrerror)
返回中心(子项:文本(“${snapshot.error}”);
返回中心(子项:文本(snapshot.data[“registerNew]”);
},
),
);
}
}
如果您试图使用键,您可能希望在getJsonLanguagePack()
将来的回调中返回Map
而不是String
。@Slahloyuni Yea这是我第一次做的,但我得到一个错误,说字符串类型不是future类型的子类型,或者您可以编辑您的问题并添加一个json文件的示例吗?您的json是一个数组,因此您应该返回List
,而不是string@SlahLayouni无论我返回什么,我都会得到上面的错误。静态未来getJsonLanguagePack()异步{SharedReferences pref=等待SharedReferences.getInstance();返回(json.decode(pref.getString('languagePack'))作为列表);}holy!哈哈,你是一个救生员:D真的是最好的颤振相关问题的最佳帮手。非常感谢,谢谢。我只是通过在这里解决问题来提高自己:)
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"]));
},
),
);
}
}