【问题标题】:JSON.DECODE returning null value, FlutterJSON.DECODE 返回空值,颤振
【发布时间】:2021-07-28 11:58:12
【问题描述】:

我正在尝试创建一个测验应用程序,我在其中创建卡片,例如当用户单击特定卡片时,它将被重定向到该测验页面。

这是我试图获取 json 文件数据的地方,这些数据是测验问题

class getjson extends StatelessWidget {
 
  @override
  Widget build(BuildContext context) {
    
    return FutureBuilder(
      future:DefaultAssetBundle.of(context).loadString("assets/questions/generalQ.json"),
        builder: (context, snapshot) {
        List mydata = json.decode(snapshot.data.toString());
        print(mydata);
        if (mydata == null) {
          return Scaffold(
            body: Center(
              child: Text(
                "Loading",
              ),
            ),
          );
        } else {
          return quizpage();
        }
      },
    );
  }
}


class quizpage extends StatefulWidget {
  @override
  _quizpageState createState() => _quizpageState();
}

class _quizpageState extends State<quizpage> {
  @override
  Widget build(BuildContext context) {
    return Container(
      
    );
  }
}

我在这里创建了卡片小部件

Widget customcard(String langname, String image, String des){
    return Padding(
      padding: EdgeInsets.symmetric(
        vertical: 20.0,
        horizontal: 30.0,
      ),
      child: InkWell(
        onTap: (){
          Navigator.of(context).pushReplacement(MaterialPageRoute(builder: (context)=>getjson(),));
        },

我正在 onTap 上调用 getjson 类。

当我在卡片上运行应用程序时,它显示“正在加载”,它在 getjson 类的“mydata”上返回 null。

如何解决?为什么它在 mydata 上返回 null?请帮忙!

JSON 文件:

[
    {
        "1": "What is the world's most populated country?",
        "2": "Each year World Red Cross and Red Crescent Day is celebrated on",
        "3": "The ozone layer restricts"
    },
    {
        "1": {
            "a": "Russia",
            "b": "China",
            "c": "USA"
        },
        "2": {
            "a": "May 8",
            "b": "May 18",
            "c": "April 28"
           
        },
        "3": {
            "a": "Visible light",
            "b": "Ultraviolet radiation",
            "c": "Infrared radiation"
        }
    }
]

【问题讨论】:

    标签: json flutter flutter-futurebuilder


    【解决方案1】:

    其实很简单,你说你的 list = a Future 。当您执行 json.decode(snapshot.data) 时,futureBuilder 的 Future 尚未完成,因此当时的 mydata 是 snapshot.data,它为空。你应该写:

    if(snapshot.ConnectionState == ConnectionState.done){
       List mydata = json.decode(snapshot.data.toString());
       return quizpage();
    
    }else{
    return Scaffold(
               body: Center(
                 child: Text(
                   "Loading",
                 ),
               ),
             );
    }
    

    【讨论】:

    • 我已经添加了json文件,你可以检查一下吗。
    • 但我的快照数据仍然为空。
    • 并且它也打印出这个错误,“方法'[]'在null上被调用。接收者:null尝试调用:[](0)”
    • 那之后你会在测验页面上传递你的 mydata 列表吗?您的测验应用容器的加载是否发生了变化?您确定要读取的 json 在正确的目录中吗?另外,定义您将从 json 获得的内容是一个很好的做法。在您的 json 中,您返回一个 List>,因此为了调用 mydata,您应该编写类似 mydata[0]["1"] 的内容。您调用 [](0) 是什么? mydata[0] 是一个 Map 来调用一个带有键值对的映射,你应该写 map["key"]。
    • 当我运行应用程序时出现此错误,并且 json 文件位于正确的目录中,我正在返回 mydata 像这样 return quizpage(mydata:mydata);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2022-06-18
    • 2021-08-20
    • 1970-01-01
    • 2023-03-11
    • 2021-11-02
    相关资源
    最近更新 更多