Flutter 在结果页面中显示答案

Flutter 在结果页面中显示答案,flutter,android-studio,dart,Flutter,Android Studio,Dart,我创建了一个问答应用程序,它向用户询问关于Bayin(菲律宾古代文字)的问题。测验和结果页都很好。我希望我的结果页面显示给出的问题和正确答案(如果他们回答错误),并在结果页面上显示他们回答的正确答案(如果他们回答正确)。现在,我的结果页面只显示分数和分数,如果他们是好的,坏的,或优秀的。我想让应用程序显示所有问题的正确答案 这是我的测验代码: import 'dart:async'; import 'dart:convert'; import 'dart:math'; import 'packa

我创建了一个问答应用程序,它向用户询问关于Bayin(菲律宾古代文字)的问题。测验和结果页都很好。我希望我的结果页面显示给出的问题和正确答案(如果他们回答错误),并在结果页面上显示他们回答的正确答案(如果他们回答正确)。现在,我的结果页面只显示分数和分数,如果他们是好的,坏的,或优秀的。我想让应用程序显示所有问题的正确答案

这是我的测验代码:

import 'dart:async';
import 'dart:convert';
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:hive/hive.dart';
import 'package:path_provider/path_provider.dart' as path_provider;
import 'package:path_provider/path_provider.dart';
import 'QuizHome.dart';
import 'Results/ResultPage.dart';

class Quizjson extends StatelessWidget {
  // accept the langname as a parameter

  

  // a function
  // sets the asset to a particular JSON file
  // and opens the JSON

  @override
  Widget build(BuildContext context) {
    // this function is called before the build so that
    // the string assettoload is avialable to the DefaultAssetBuilder

    // and now we return the FutureBuilder to load and decode JSON
    return FutureBuilder(
      future:
      DefaultAssetBundle.of(context).loadString('assets/Sample.json', cache: false),
      builder: (context, snapshot) {
        List mydata = json.decode(snapshot.data.toString());
        if (mydata == null) {
          return Scaffold(
            body: Center(
              child: Text(
                "Loading",
              ),
            ),
          );
        } else {
          return quizpage(mydata: mydata);
        }
      },
    );
  }
}

class quizpage extends StatefulWidget {
  final List mydata;

  quizpage({Key key, @required this.mydata}) : super(key: key);
  @override
  _quizpageState createState() => _quizpageState(mydata);
}

class _quizpageState extends State<quizpage> {
      final List mydata;
  _quizpageState(this.mydata);

  Color colortoshow = Colors.brown;
  Color right = Colors.green;
  Color wrong = Colors.red;
  int mark = 0;
  Box marksBox;
  int i = 1;
  bool disableAnswer = false;
  // extra varibale to iterate
  int j = 1;
  int timer = 30;
  String showtimer = "30";
  var random_array;

  Map<String, Color> btncolor = {
    "a": Colors.brown,
    "b": Colors.brown,
    "c": Colors.brown,
    "d": Colors.brown,
  };

  bool canceltimer = false;

  // code inserted for choosing questions randomly
  // to create the array elements randomly use the dart:math module
  // -----     CODE TO GENERATE ARRAY RANDOMLY

  genrandomarray(){
    var distinctIds = [];
    var rand = new Random();
    for (int i = 0; ;) {
      distinctIds.add(rand.nextInt(58));
      random_array = distinctIds.toSet().toList();
      if(random_array.length < 58){
        continue;
      }else{
        break;
      }
    }
    print(random_array);
  }

  //   var random_array;
  //   var distinctIds = [];
  //   var rand = new Random();
  //     for (int i = 0; ;) {
  //     distinctIds.add(rand.nextInt(10));
  //       random_array = distinctIds.toSet().toList();
  //       if(random_array.length < 10){
  //         continue;
  //       }else{
  //         break;
  //       }
  //     }
  //   print(random_array);

  // ----- END OF CODE
  // var random_array = [1, 6, 7, 2, 4, 10, 8, 3, 9, 5];

  // overriding the initstate function to start timer as this screen is created
  @override
  void initState() {
    starttimer();
    genrandomarray();
    super.initState();
  }

  // overriding the setstate function to be called only if mounted
  @override
  void setState(fn) {
    if (mounted) {
      super.setState(fn);
    }
  }

  void starttimer() async {
    const onesec = Duration(seconds: 1);
    Timer.periodic(onesec, (Timer t) {
      setState(() {
        if (timer < 1) {
          t.cancel();
          nextquestion();
        } else if (canceltimer == true) {
          t.cancel();
        } else {
          timer = timer - 1;
        }
        showtimer = timer.toString();
      });
    });
  }

  void nextquestion() {
    canceltimer = false;
    timer = 30;
    setState(() {
      if (j < 10) {
        i = random_array[j];
        j++;
      } else {
        Navigator.of(context).pushReplacement(MaterialPageRoute(
          builder: (context) => ResultPage(mark: mark),

        ));

      }
      btncolor["a"] = Colors.brown;
      btncolor["b"] = Colors.brown;
      btncolor["c"] = Colors.brown;
      btncolor["d"] = Colors.brown;
      disableAnswer = false;
    });
    starttimer();
  }

  void checkanswer(String k) {


    if (mydata[2][i.toString()] == mydata[1][i.toString()][k]) {

      mark = mark + 5;
      colortoshow = right;
    } else {
      // just a print sattement to check the correct working
      // debugPrint(mydata[2]["1"] + " is equal to " + mydata[1]["1"][k]);
      colortoshow = wrong;
    }
    setState(() {
      // applying the changed color to the particular button that was selected
      btncolor[k] = colortoshow;
      canceltimer = true;
      disableAnswer = true;
    });
    // nextquestion();
    // changed timer duration to 1 second
    Timer(Duration(seconds: 2), nextquestion);
  }

  Widget ChoiceButton(String k) {
    return Padding(
      padding: EdgeInsets.symmetric(
          vertical: 10.0,
          horizontal: 10.0),
      child: MaterialButton(
        onPressed: ()=>checkanswer(k),
        child: Text(
            mydata[1][i.toString()][k],
            style: TextStyle(
                color: Colors.white
            )),
        color: btncolor[k],
        minWidth: 150.0,
        height: 45.0,
      ),
    );

  }

  @override
  Widget build(BuildContext context) {
    SystemChrome.setPreferredOrientations(
        [DeviceOrientation.portraitDown, DeviceOrientation.portraitUp]);
    return WillPopScope(
      onWillPop: () {
        return showDialog(
            context: context,
            builder: (context) => AlertDialog(
              title: Text(
                "Easy Round",
              ),
              content: Text("You Can't Go Back At This Stage."),
              actions: <Widget>[
                FlatButton(
                  onPressed: () {
                    Navigator.of(context).pop();
                  },
                  child: Text(
                    'Ok',
                  ),
                )
              ],
            ));
      },
      child: Scaffold(
        backgroundColor: Colors.green[700],
        body: Column(
          children: <Widget>[
            Expanded(
              flex: 5,
              child: Container(
                padding: EdgeInsets.all(15.0),
                alignment: Alignment.bottomLeft,
                child: Center(
                  child: Text(
                    mydata[0][i.toString()],
                    style: TextStyle(
                      fontSize: 200.0,
                      fontFamily: "baybayin",
                      color: Colors.white
                    ),
                  ),
                ),
              ),
            ),
            Expanded(
              flex: 6,
              child: AbsorbPointer(
                absorbing: disableAnswer,
                child: Container(
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: <Widget>[
                      Center(
                        child: Row(
                          children: [
                            ChoiceButton('a'),
                            ChoiceButton('b'),
                          ],
                        ),
                      ),
                      Center(
                        child: Row(
                          children: [
                            ChoiceButton('c'),
                            ChoiceButton('d'),
                          ],
                        ),
                      ),
                    ],
                  ),
                ),
              ),
            ),
            Expanded(
              flex: 1,
              child: Container(
                alignment: Alignment.topCenter,
                child: Center(
                  child: Text(
                    showtimer,
                    style: TextStyle(
                      fontSize: 35.0,
                      color: Colors.white,
                      fontWeight: FontWeight.w700,
                      fontFamily: 'Risque',
                    ),
                  ),
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }

}
导入'dart:async';
导入“dart:convert”;
导入“dart:math”;
进口“包装:颤振/材料.省道”;
导入“包:flifter/services.dart”;
导入“package:hive/hive.dart”;
导入“package:path\u provider/path\u provider.dart”作为path\u provider;
导入“package:path_provider/path_provider.dart”;
输入'QuizHome.dart';
导入“Results/ResultPage.dart”;
类Quizjson扩展了无状态小部件{
//接受langname作为参数
//函数
//将资产设置为特定的JSON文件
//并打开JSON
@凌驾
小部件构建(构建上下文){
//在生成之前调用此函数,以便
//字符串AssetLoad可用于DefaultAssetBuilder
//现在我们返回FutureBuilder来加载和解码JSON
回归未来建设者(
未来:
DefaultAssetBundle.of(context.loadString('assets/Sample.json',cache:false),
生成器:(上下文,快照){
List mydata=json.decode(snapshot.data.toString());
if(mydata==null){
返回脚手架(
正文:中(
子:文本(
“加载”,
),
),
);
}否则{
返回quizpage(mydata:mydata);
}
},
);
}
}
类quizpage扩展StatefulWidget{
最后的数据清单;
quizpage({Key-Key,@required this.mydata}):super(Key:Key);
@凌驾
_quizpageState createState()=>\u quizpageState(mydata);
}
类quizpageState扩展了状态{
最后的数据清单;
_quizpageState(this.mydata);
Color colortoshow=Colors.brown;
Color right=Colors.green;
颜色错误=颜色。红色;
整数分=0;
盒子标记盒;
int i=1;
bool disableAnswer=假;
//要迭代的额外变量
int j=1;
int定时器=30;
字符串showtimer=“30”;
var随机数组;
映射btncolor={
“a”:颜色。棕色,
“b”:颜色。棕色,
“c”:颜色。棕色,
“d”:颜色。棕色,
};
bool canceltimer=false;
//插入随机选择问题的代码
//要随机创建数组元素,请使用dart:math模块
//----随机生成数组的代码
genrandomarray(){
var差异=[];
var rand=new Random();
对于(int i=0;;){
加上(兰特·耐克斯汀(58));
random_数组=differentids.toSet().toList();
if(随机数组长度<58){
继续;
}否则{
打破
}
}
打印(随机数组);
}
//var随机数组;
//var差异=[];
//var rand=new Random();
//对于(int i=0;;){
//添加(兰特耐克斯汀(10));
//random_数组=differentids.toSet().toList();
//if(随机数组长度<10){
//继续;
//}其他{
//中断;
//       }
//     }
//打印(随机数组);
//----代码结束
//var random_数组=[1,6,7,2,4,10,8,3,9,5];
//在创建此屏幕时重写initstate函数以启动计时器
@凌驾
void initState(){
starttimer();
genrandomarray();
super.initState();
}
//重写仅在装入时调用的setstate函数
@凌驾
无效设置状态(fn){
如果(已安装){
超级设定状态(fn);
}
}
void starttimer()异步{
const onesec=持续时间(秒:1);
定时器周期(1秒,(定时器t){
设置状态(){
如果(计时器<1){
t、 取消();
nextquestion();
}else if(canceltimer==true){
t、 取消();
}否则{
定时器=定时器-1;
}
showtimer=timer.toString();
});
});
}
void nextquestion(){
取消计时器=假;
定时器=30;
设置状态(){
如果(j<10){
i=随机_数组[j];
j++;
}否则{
导航器.of(上下文).pushReplacement(MaterialPage路线(
生成器:(上下文)=>ResultPage(标记:标记),
));
}
btncolor[“a”]=颜色。棕色;
btncolor[“b”]=颜色。棕色;
btncolor[“c”]=颜色。棕色;
btncolor[“d”]=颜色。棕色;
disableAnswer=假;
});
starttimer();
}
无效检查应答(字符串k){
if(mydata[2][i.toString()]==mydata[1][i.toString()][k]){
分数=分数+5;
colortoshow=右;
}否则{
//只是一份检查工作是否正常的打印文件
//debugPrint(mydata[2][“1”]+”等于“+mydata[1][“1”][k]);
colortoshow=错误;
}
设置状态(){
//将更改的颜色应用于选定的特定按钮
btncolor[k]=彩色显示;
canceltimer=true;
disableAnswer=正确;
});
//nextquestion();
//将计时器持续时间更改为1秒
计时器(持续时间(秒数:2),下一个问题);
}
小部件选择按钮(字符串k){
返回填充(
填充:EdgeInsets.symmetric(
垂直线:10.0,
水平线:10.0),
子:材质按钮(
按下:()=>检查答案(k),
子:文本(
mydata[1][i.toString()][k],
样式:TextStyle(
颜色:颜色。白色
)),
颜色:btncolor[k],
最小宽度:150.0,
身高:45.0,
),
);
}
@凌驾
小部件构建(构建上下文){
SystemChrome.setPreferredOrientations(
[设备定向。肖像向下,设备定向。肖像向上];
返回式示波器(
onWillPop:(){
import 'package:worldtime_app/Quiz/QuizHome.dart';
import 'package:worldtime_app/main.dart';
import 'package:flutter/material.dart';
import 'package:hive/hive.dart';
import 'package:path_provider/path_provider.dart';




class ResultPage extends StatefulWidget {
  
  int mark;
  ResultPage({Key key,  this.mark, Box marksBox}) : super(key: key);
  @override
  _ResultPageState createState() => _ResultPageState(mark);
}

class _ResultPageState extends State<ResultPage> {


  List<String> images = [
    'assets/excellent.jpg',
    'assets/good.png',
    'assets/Sorry.png'
  ];
  int mark1= 0;
  String message;
  String image;
  Box<int>marksBox;

  int score = 1;
  @override

  @override
  void initState(){
    if(mark<5){
      image = images[2];
      message = 'Try Again..\n' + 'You scored $mark';
    }
    else if(mark==5){
      image = images[1];
      message = 'Good.. \n' + 'You scored $mark';
    }
    else{
      image = images[0];
      message =  'Excellent!!!...\n' + 'You scored $mark';
    }
    super.initState();
    openBox();
  }
  Future openBox() async{
    var dir = await getApplicationDocumentsDirectory();
    Hive.init(dir.path);
    marksBox = await Hive.openBox('mark');
    return;
  }

  int mark;
  _ResultPageState(this.mark);
  @override
  Widget build(BuildContext context) {

    return Scaffold(

      appBar: AppBar(
        title: Text(
          "Result"
        )
      ),
      body: Column(
        children:[
          Expanded(
            flex: 6,
            child: Material(
              elevation: 5.0,
              child: Container(
                child:Column(
                  children: [
                    Material(
                      child: Container(
                        width: 300.0,
                        height: 300.0,
                        child: ClipRect(
                          child: Image(
                            image: AssetImage(
                              image,
                            )
                          )
                        ),
                      ),
                    ),
                    Center(
                      child: Text(
                        message,
                        style: TextStyle(
                          fontSize: 20.0,
                          fontFamily: 'Staatliches'
                        ),
                      ),
                    )
                  ],
                ),
              ),
            ),
          ),
          Expanded(
            flex:4,
            child: Row(
                mainAxisAlignment: MainAxisAlignment.center,
              children:<Widget>[

               OutlineButton(
                  onPressed: () {
                    Mark();
                     Navigator.of(context).pushReplacement(MaterialPageRoute(builder: (context)=> QuizHome(mark:marksBox.get(mark), mark1:0,mark2:0, mark3: 0,)));
                  },
                  child: Text(
                    'Continue',

                    style: TextStyle(
                      fontSize: 20.0,
                      fontFamily: 'Staatliches'
                    )
                  ),
                   padding: EdgeInsets.symmetric(vertical: 10.0,horizontal: 15.0),
                 borderSide: BorderSide(width: 3.0,color: Colors.brown[700])
                )
              ]
            )

          )
       ]
      )
    );
  }

  void Mark() async{
    marksBox.put(mark,mark);
    print(marksBox.get(mark));
  }
}