JSON.DECODE возвращает нулевое значение, Flutter

Я пытаюсь создать викторину, в которой я создаю карты, например, когда пользователь нажимает на определенную карту, она будет перенаправлена ​​​​на эту страницу викторины.

вот где я пытаюсь получить данные файла 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(),));
        },

я вызываю класс getjson на onTap.

когда я запускаю приложение, нажмите на карточку, оно показывает, что я загружаюсь, оно возвращает ноль для моих данных класса getjson.

как это исправить? почему он возвращает ноль в mydata? Пожалуйста помоги!

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"
        }
    }
]


person TimeToCode    schedule 06.05.2021    source источник


Ответы (1)


На самом деле это довольно просто, вы говорите, что ваш список = Будущее. Когда вы выполняете json.decode(snapshot.data), Future вашего futureBuilder еще не завершен, поэтому 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",
             ),
           ),
         );
}
person user14624595    schedule 06.05.2021
comment
Я добавил файл json, не могли бы вы проверить. - person TimeToCode; 06.05.2021
comment
но я все еще получаю нуль в данных моментального снимка. - person TimeToCode; 06.05.2021
comment
и он также печатает эту ошибку. Метод «[]» был вызван с нулевым значением. Получатель: null Попытка вызова: [](0) - person TimeToCode; 06.05.2021
comment
После этого вы передаете свой список mydata на страницу викторины? Изменилась ли загрузка на ваш контейнер quizapp? Вы уверены, что json, который вы пытаетесь прочитать, находится в правильном каталоге? Кроме того, рекомендуется определить, что вы получите от json. В вашем json вы возвращаете List‹Map‹String, dynamic››, поэтому для вызова mydata вы должны написать что-то вроде mydata[0]["1"] . Что вы называете [] (0)? mydata[0] — это Map‹String, dynamic› для вызова карты с парой ключ-значение, которую вы должны написать map[key]. - person user14624595; 06.05.2021
comment
когда я запускаю приложение, возникает эта ошибка, и файл json находится в правильном каталоге, и я возвращаю свои данные, как это return quizpage (mydata: mydata); - person TimeToCode; 06.05.2021
comment
пожалуйста, распечатайте (mydata) перед возвратом страницы викторины и покажите мне, как вы получаете элементы из этого списка, как указано выше? - person user14624595; 06.05.2021
comment
я просто возвращаю return quizpage(); теперь он показывает пустой экран после нажатия на карточку, пустой экран только потому, что я ничего не делал на странице викторины, но я печатаю свои данные, и они пусты - person TimeToCode; 06.05.2021
comment
Если вы печатаете mydata после connectionState == ConnectionState.done, и он по-прежнему равен нулю, я не вижу решения, извините. - person user14624595; 06.05.2021
comment
я печатаю его перед возвратом страницы викторины(). Хорошо, спасибо за ваше время. - person TimeToCode; 06.05.2021