Json 如何使用存储在FutureBuilder';s snapshot.data(没有类)?

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

我的getJsonLanguagePack():

 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"]));
        },
      ),
    );
  }
}