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