dart - 在本地获取并存储 json

标签 dart flutter

我问了这个问题here以前,仍然没有取得太大进展。我正在尝试从一个端点获取一个 json 格式的列表并将其分配给一个实例,然后我将逐步执行该实例。

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:async';
import 'dart:convert';

import '../utils/quiz.dart';
import '../utils/question.dart';

Quiz quiz1 = Quiz([
  Question(
      question: 'What is 1x1',
      option1: '2',
      option2: '3',
      option3: '4',
      option4: '1',
      answer: '1'),
  Question(
      question: 'What is 1x2',
      option1: '2',
      option2: '3',
      option3: '4',
      option4: '1',
      answer: '1'),
  Question(
      question: 'What is 1x3',
      option1: '2',
      option2: '3',
      option3: '4',
      option4: '1',
      answer: '1'),
  Question(
      question: 'What is 1x4',
      option1: '2',
      option2: '3',
      option3: '4',
      option4: '1',
      answer: '1'),
  Question(
      question: 'What is 1x5',
      option1: '5',
      option2: '3',
      option3: '4',
      option4: '1',
      answer: '1')
]);



class QuestionScreen extends StatefulWidget {
  @override
  _QuestionScreenState createState() => new _QuestionScreenState();
}

class _QuestionScreenState extends State<QuestionScreen> {
  Quiz quiz;
  Question currentQuestion;
  String questionText;
  int questionNumber;
  bool isCorrect;
  String option1;
  String option2;
  String option3;
  String option4;
  String answer;
  int index;
  int counter = 0;

  int _selected;
  String url = 'http://www.cloudace.io/questions';

  void onChanged(int value) {
    setState(() {
      _selected = value;
    });
  }


List<Question> parseQuestions(String responseBody) {
  final parsed = json.decode(responseBody).cast<Map<String, dynamic>>();

  return parsed.map<Question>((json) => Question.fromJson(json)).toList();
}

Future<List<Question>> fetchQuestion(http.Client client) async {
  final response = await client.get('http://www.cloudace.io/questions');

  return parseQuestions(response.body);//return compute(parseQuestions, response.body);
}

Future assignQuiz() async {
    quiz = Quiz(await fetchQuestion(http.Client()));
  }

  @override
  void initState() {
    super.initState();
    assignQuiz();
    print(quiz.toString());
  }

  @override
  Widget build(BuildContext context) {
    if (quiz != null) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Quiz'),
      ),
      body: Container(
        child: Column(
          children: <Widget>[
            Text(quiz.questions[counter].question),
            RadioListTile(
                value: 0,
                groupValue: _selected,
                onChanged: (int value) {
                  onChanged(value);
                },
                activeColor: Colors.red,
                subtitle: Text(
                  quiz.questions[counter].option1,
                )),
            RadioListTile(
                value: 1,
                groupValue: _selected,
                onChanged: (int value) {
                  onChanged(value);
                },
                activeColor: Colors.red,
                subtitle: Text(
                  quiz.questions[counter].option2,
                )),
            RadioListTile(
                value: 2,
                groupValue: _selected,
                onChanged: (int value) {
                  onChanged(value);
                },
                activeColor: Colors.red,
                subtitle: Text(
                  quiz.questions[counter].option3,
                )),
            RadioListTile(
                value: 3,
                groupValue: _selected,
                onChanged: (int value) {
                  onChanged(value);
                },
                activeColor: Colors.red,
                subtitle: Text(
                  quiz.questions[counter].option4,
                )),
            RaisedButton(
                child: Text('Press Me'),
                onPressed: () {
                  print('counter is: $counter \n_selected is: $_selected');
                  setState(() {
                    onChanged(null);
                    if (counter < 5) {
                      counter++;
                    } else {
                      counter = 0;
                    }
                  });
                })
          ],
        ),
      ),
    );
  } return Center(child: CircularProgressIndicator());}
}

如果我设置 quiz=quiz1,我会得到所需的行为,但使用 future 会返回 null,如何在构建小部件之前从 json 端点填充测验?使用 initState 似乎没有什么不同。

最佳答案

将分配给 quiz 的内容包装在 setState 中。

assignQuiz() async {
  Quiz newQuiz = Quiz(await fetchQuestion(http.Client()));
  setState(() {
    quiz = newQuiz;
  });
}

关于dart - 在本地获取并存储 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51138919/

相关文章:

flutter -> 找不到 com.google.gms.google-services :4. 3.15 :. 要求者:项目:

flutter - 如何在 Flutter 中从 Web 加载和呈现 PDF 文件

dart - 向对象添加属性(或至少类似的结果)

android - flutter webview net::ERR_NAME_NOT_RESOLVED

oop - 如何在不可变抽象基类的默认方法中实例化子类?

flutter - 有插曲和读取登录页面,然后进入管理页面 flutter

string - flutter/Dart : Convert HEX color string to Color?

flutter - Dart 中的 'Private properties' 是什么?

dart - 在 null 上调用了 Flutter 方法 []

flutter - Dart 短绒 : enforce type annotation everywhere except lambdas