Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 在本地获取并存储json_Dart_Flutter - Fatal编程技术网

Dart 在本地获取并存储json

Dart 在本地获取并存储json,dart,flutter,Dart,Flutter,我以前问过这个问题,但仍然没有取得多大进展。我试图从端点获取一个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'; Q

我以前问过这个问题,但仍然没有取得多大进展。我试图从端点获取一个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());}
}
导入“包装:颤振/材料.省道”;
将“package:http/http.dart”导入为http;
导入“dart:async”;
导入“dart:convert”;
导入“../utils/quick.dart”;
导入“../utils/question.dart”;
测验quiz1=测验([
问题:(
问题:“什么是1x1”,
选项1:“2”,
备选案文2:“3”,
选项3:“4”,
选项4:“1”,
答复:"一",,
问题:(
问题:“什么是1x2”,
选项1:“2”,
备选案文2:“3”,
选项3:“4”,
选项4:“1”,
答复:"一",,
问题:(
问题:“什么是1x3”,
选项1:“2”,
备选案文2:“3”,
选项3:“4”,
选项4:“1”,
答复:"一",,
问题:(
问题:“什么是1x4”,
选项1:“2”,
备选案文2:“3”,
选项3:“4”,
选项4:“1”,
答复:"一",,
问题:(
问题:“什么是1x5”,
选项1:“5”,
备选案文2:“3”,
选项3:“4”,
选项4:“1”,
答:"1")
]);
类QuestionScreen扩展StatefulWidget{
@凌驾
_QuestionScreenState createState()=>新建_QuestionScreenState();
}
类_QuestionScreenState扩展状态{
问答游戏;
问题-当前问题;
字符串文本;
整数;
布尔是正确的;
字符串选项1;
字符串选项2;
字符串选项3;
字符串选项4;
字符串回答;
整数指数;
int计数器=0;
int_选定;
字符串url='0http://www.cloudace.io/questions';
更改后的void(int值){
设置状态(){
_所选=值;
});
}
列出问题(字符串响应库){
final parsed=json.decode(responseBody.cast();
返回parsed.map((json)=>Question.fromJson(json)).toList();
}
将来的fetchQuestion(http.Client)异步{
最终响应=等待客户端。获取('http://www.cloudace.io/questions');
return parseQuestions(response.body);//return compute(parseQuestions,response.body);
}
Future assignquick()异步{
quick=quick(等待获取问题(http.Client());
}
@凌驾
void initState(){
super.initState();
分配测验();
打印(quick.toString());
}
@凌驾
小部件构建(构建上下文){
if(测验!=null){
返回脚手架(
appBar:appBar(
标题:文本(“测验”),
),
主体:容器(
子:列(
儿童:[
文本(测验.问题[计数器].问题),
放射科医师(
值:0,
groupValue:\u已选定,
onChanged:(int值){
一旦改变(价值);
},
activeColor:Colors.red,
字幕:文本(
测验。问题[柜台]。选项1,
)),
放射科医师(
价值:1,
groupValue:\u已选定,
onChanged:(int值){
一旦改变(价值);
},
activeColor:Colors.red,
字幕:文本(
测验。问题[柜台]。选项2,
)),
放射科医师(
价值:2,
groupValue:\u已选定,
onChanged:(int值){
一旦改变(价值);
},
activeColor:Colors.red,
字幕:文本(
测验。问题[柜台]。选项3,
)),
放射科医师(
价值:3,
groupValue:\u已选定,
onChanged:(int值){
一旦改变(价值);
},
activeColor:Colors.red,
字幕:文本(
测验。问题[柜台]。选项4,
)),
升起的按钮(
child:Text('Press Me'),
已按下:(){
打印('counter is:$counter\n\u selected is:$\u selected');
设置状态(){
onChanged(空);
如果(计数器<5){
计数器++;
}否则{
计数器=0;
}
});
})
],
),
),
);
}返回中心(子项:CircularProgressIndicator());}
}

如果我设置quick=quiz1,我将获得所需的行为,但使用future返回空值,那么在构建小部件之前,如何从json端点填充quick?使用initState似乎没有什么区别。

将作业包装到
测验
中的
设置状态

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

将作业包装到
测验
中的
设置状态

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

谢谢这正是我想要的谢谢!这正是我想要的