0

This is the object that I want to send to my server from the Flutter client but I am not able to:

{
    "questions": [
        {
            "question" : "La velocidad de la luz es igual a",
            "solucion1": "300k",
            "solucion2": "250k",
            "solucion3" : "150k",
            "answer" : "300k"
        },
        {
            "question" : "Un numero primo es",
            "solucion1": "Solo puede ser dividido entre 1 y si mismo",
            "solucion2": "Puede ser dividido entre 2",
            "solucion3" : "Tiene raiz cuadrada",
            "answer" : "Solo puede ser dividido entre 1 y si mismo"
        },
        {
            "question" : "Las matematicas son",
            "solucion1": "La ciencia que estudia la historia",
            "solucion2": "La ciencia que estudia el oceano",
            "solucion3" : "La ciencia que estudia la relacion entre los numeros",
            "answer" : "La ciencia que estudia la relacion entre los numeros"
        }
    ]
}

Where "questions" could be N amount. Now let me explain how I am trying to build it. I am using a class to handle the questions as follows:

class Questions {
  String question = '';
  String solucion1 = '';
  String solucion2 = '';
  String solucion3 = '';
  String answer = '';

  Questions(
      {required this.answer,
      required this.question,
      required this.solucion1,
      required this.solucion2,
      required this.solucion3});

  Questions.fromJson(Map<String, dynamic> json) {
    question = json['question'];
    solucion1 = json['solucion1'];
    solucion2 = json['solucion2'];
    solucion3 = json['solucion3'];
    answer = json['answer'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['question'] = this.question;
    data['solucion1'] = this.solucion1;
    data['solucion2'] = this.solucion2;
    data['solucion3'] = this.solucion3;
    data['answer'] = this.answer;
    return data;
  }
}

After this, I am trying to build each question with its 3 solutions and its answer as follows:

class Quiz {
  List<Questions> questions = [];

  Quiz({required this.questions});

  Quiz.fromJson(Map<String, dynamic> json) {
    if (json['questions'] != null) {
      json['questions'].forEach((v) {
        questions.add(new Questions.fromJson(v));
      });
    }
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    if (this.questions != []) {
      data['questions'] = this.questions.map((v) => v.toJson()).toList();
    }
    return data;
  }
}

Each question will ALWAYS contain: 1 question, 3 answers and 1 correct answer.

Now, on my Widget Builder I have 2 buttons, 1 to add a new question and 1 to create the quiz, meaning to send the information to the server.

This is the button I am using to add a new question:

CustomOutlinedButton(
                                onPressed: () {
                                  newQuestion = Questions(
                                      answer: answer,
                                      question: question,
                                      solucion1: solucion1,
                                      solucion2: solucion2,
                                      solucion3: solucion3);
                                  newQuiz = Quiz.fromJson(newQuestion.toJson());
                                  print(newQuiz.questions);

                                  _optiona.clear();
                                  _optionb.clear();
                                  _optionc.clear();
                                  _question.clear();
                                  _answer.clear();
                                },
                                text: 'Agregar Pregunta')

And when I try to print the value of the newQuiz that should have the values from each question it only prints [].

This is the button to send the Quiz to the request method:

CustomOutlinedButton(
                                onPressed: () async {
                                  //print(data);
                                  await createQuiz(
                                      newQuiz.questions, teacherid, subjectid);
                                },
                                text: "Crear Quiz"),

Now below the full Widget Builder code:

Widget build(BuildContext context) {
    Questions newQuestion;
    Quiz newQuiz = new Quiz(questions: []);

    String question = "";
    String solucion1 = "";
    String solucion2 = "";
    String solucion3 = "";
    String answer = "";
    return Scaffold(
      appBar: AppBar(
        title: Text("Crear un nuevo quiz de $subjectName"),
        backgroundColor: Colors.green[700],
      ),
      body: ChangeNotifierProvider(
          create: (_) => LoginFormProvider(),
          child: Builder(builder: (context) {
            var _question = TextEditingController();
            var _optiona = TextEditingController();
            var _optionb = TextEditingController();
            var _optionc = TextEditingController();
            var _answer = TextEditingController();
            final loginFormProvider =
                Provider.of<LoginFormProvider>(context, listen: true);
            return Container(
                color: Colors.grey[100],
                padding: EdgeInsets.symmetric(horizontal: 20),
                child: Center(
                  child: ConstrainedBox(
                    constraints: BoxConstraints(maxHeight: 450),
                    child: Form(
                      key: loginFormProvider.formKey,
                      child: Column(
                        children: [
                          TextFormField(
                            onChanged: (value) => question = value,
                            controller: _question,
                            decoration: buildInputDecoration(
                                hint: 'Pregunta',
                                label: 'Pregunta',
                                icon: Icons.edit),
                          ),
                          SizedBox(
                            height: 10,
                          ),
                          TextFormField(
                            onChanged: (value) => solucion1 = value,
                            controller: _optiona,
                            decoration: buildInputDecoration(
                                hint: 'Opcion A',
                                label: 'Opcion A',
                                icon: Icons.edit),
                          ),
                          SizedBox(
                            height: 10,
                          ),
                          TextFormField(
                            onChanged: (value) => solucion2 = value,
                            controller: _optionb,
                            decoration: buildInputDecoration(
                                hint: 'Opcion B',
                                label: 'Opcion B',
                                icon: Icons.edit),
                          ),
                          SizedBox(
                            height: 10,
                          ),
                          TextFormField(
                            onChanged: (value) => solucion3 = value,
                            controller: _optionc,
                            decoration: buildInputDecoration(
                                hint: 'Opcion C',
                                label: 'Opcion C',
                                icon: Icons.edit),
                          ),
                          SizedBox(
                            height: 10,
                          ),
                          TextFormField(
                            onChanged: (value) => answer = value,
                            controller: _answer,
                            cursorColor: Colors.green,
                            decoration: buildInputDecoration(
                                hint: 'Respuesta',
                                label: 'Respuesta',
                                icon: Icons.edit),
                          ),
                          SizedBox(
                            height: 15,
                          ),
                          Row(children: [
                            CustomOutlinedButton(
                                onPressed: () async {
                                  //print(data);
                                  await createQuiz(
                                      newQuiz.questions, teacherid, subjectid);
                                },
                                text: "Crear Quiz"),
                            SizedBox(
                              width: 20,
                            ),
                            CustomOutlinedButton(
                                onPressed: () {
                                  newQuestion = Questions(
                                      answer: answer,
                                      question: question,
                                      solucion1: solucion1,
                                      solucion2: solucion2,
                                      solucion3: solucion3);
                                  newQuiz = Quiz.fromJson(newQuestion.toJson());
                                  //newQuiz.toJson();
                                  print(newQuiz.questions);

                                  _optiona.clear();
                                  _optionb.clear();
                                  _optionc.clear();
                                  _question.clear();
                                  _answer.clear();
                                },
                                text: 'Agregar Pregunta'),
                          ])
                        ],
                      ),
                    ),
                  ),
                ));
          })),
    );
  }

Any ideas on how to make this happen? I have tried many things but I still get the print as [].

1 Answer 1

1

This part is not correct:

newQuiz = Quiz.fromJson(newQuestion.toJson());

Think about it, newQuestion.toJson() will give you something like:

{
  "question" : "La velocidad de la luz es igual a",
  "solucion1": "300k",
  "solucion2": "250k",
  "solucion3" : "150k",
  "answer" : "300k"
}

But Quiz.fromJson() expects data to be in a format like this:

{
  "questions": [
    {
      "question" : "La velocidad de la luz es igual a",
      "solucion1": "300k",
      "solucion2": "250k",
      "solucion3" : "150k",
      "answer" : "300k"
    }
  ]
}

Maybe try:

newQuiz = Quiz(questions: [newQuestion, ...newQuiz.questions]);

Or even just this:

newQuiz.questions.add(newQuestion);
Sign up to request clarification or add additional context in comments.

3 Comments

Your explanation makes total sense... I tried both solutions: newQuiz = Quiz(questions: [newQuestion, ...newQuiz.questions]); and newQuiz.questions.add(newQuestion); and I am getting Instance of 'Questions'. Maybe I am printing it wrong: print(newQuiz.questions);
Instead of print(newQuiz.questions); try print(newQuiz.toJson());
Jesus Christ man you fixed it... I was banging my head here for hours... Thank you so much!!!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.