首页 > 解决方案 > 如何使用存储在 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 文件中定义的键来获取我想要的值。

因为它被调和为字符数组。

非常感谢 。

标签: jsonflutter

解决方案


您不必将 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"]));
        },
      ),
    );
  }
}

推荐阅读