flutter - 您如何存储正确答案的数量以显示在测验应用程序的分数页面上?
问题描述
我正在 Flutter 中创建一个测验应用程序。在这个应用程序中,我想显示正确答案的数量,但我尝试过的方式不起作用。我声明了一个变量“correctAnswerCount”来存储问题页面、正确答案页面和分数页面上正确答案的数量。但是,correctAnswerCount 在分数页面上显示为“null”。我认为这种方式没有正确给出正确的AnswerCount 值,但我不确定如何解决这个问题。你能给我一些建议吗?谢谢你。
question_page.dart:
import 'package:flutter/material.dart';
import '../question_answer.dart';
import 'wrong_answer_page.dart';
import '../components/answer_button.dart';
import '../quiz_list.dart';
import 'correct_answer_page.dart';
QuizList quizList = QuizList();
class QuestionPage extends StatefulWidget {
QuestionPage(
{@required this.setState, this.scoreKeeper, this.correctAnswerCount});
final QuizList setState;
final List<Icon> scoreKeeper;
final int correctAnswerCount;
@override
_QuestionPageState createState() => _QuestionPageState();
}
class _QuestionPageState extends State<QuestionPage> {
List<Icon> scoreKeeper = [];
int correctAnswerCount;
void checkAnswer(String userPickedAnswer) {
String correctAnswer = quizList.getQuestionAnswer();
if (userPickedAnswer == correctAnswer) {
scoreKeeper.add(
Icon(Icons.circle_outlined, color: Colors.red),
);
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => CorrectAnswerPage(
scoreKeeper: scoreKeeper,
correctAnswerCount: correctAnswerCount)));
} else {
scoreKeeper.add(
Icon(Icons.close, color: Colors.blue),
);
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => WrongAnswerPage(scoreKeeper: scoreKeeper)));
}
setState(() {
print(correctAnswerCount.toString());
quizList.nextQuestion();
});
}
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Expanded(
flex: 5,
child: Padding(
padding: EdgeInsets.all(10.0),
child: Center(
child: Text(
quizList.getQuestionText(),
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 25.0,
color: Colors.black,
),
),
),
),
),
Expanded(
child: Padding(
padding: EdgeInsets.all(15.0),
child: AnswerButton(
userPickedAnswer: quizList.getAnswer1(),
onTap: () {
setState(() {
checkAnswer(quizList.getAnswer1());
});
}),
)),
Expanded(
child: Padding(
padding: EdgeInsets.all(15.0),
child: AnswerButton(
userPickedAnswer: quizList.getAnswer2(),
onTap: () {
setState(() {
checkAnswer(quizList.getAnswer2());
});
}),
)),
Expanded(
child: Padding(
padding: EdgeInsets.all(15.0),
child: AnswerButton(
userPickedAnswer: quizList.getAnswer3(),
onTap: () {
setState(() {
checkAnswer(quizList.getAnswer3());
});
}),
)),
Expanded(
child: Padding(
padding: EdgeInsets.all(15.0),
child: AnswerButton(
userPickedAnswer: quizList.getAnswer4(),
onTap: () {
setState(() {
checkAnswer(quizList.getAnswer4());
});
}),
)),
Row(children: scoreKeeper)
],
);
}
}
/*
question1: 'You can lead a cow down stairs but not up stairs.', false,
question2: 'Approximately one quarter of human bones are in the feet.', true,
question3: 'A slug\'s blood is green.', true,
*/
正确答案页面.dart:
import 'package:flutter/material.dart';
import '../components/next_question_button.dart';
import '../screens/question_page.dart';
import '../quiz_list.dart';
import 'score_page.dart';
class CorrectAnswerPage extends StatelessWidget {
CorrectAnswerPage({this.scoreKeeper, this.correctAnswerCount});
final List<Icon> scoreKeeper;
final int correctAnswerCount;
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
Container(
child: Center(
child: Text(
'正解',
style: TextStyle(
fontSize: 100,
fontWeight: FontWeight.bold,
color: Colors.red),
),
),
),
Divider(
color: Colors.grey,
indent: 16,
endIndent: 16,
),
Text(quizList.getExplanation(),
style: TextStyle(
fontSize: 20, fontWeight: FontWeight.bold, color: Colors.grey)),
NextQuestionButton(onTap: () {
if (quizList.isFinished() == true) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>
ScorePage(correctAnswerCount: correctAnswerCount)));
} else {
//なくてもこのページでは表示される
scoreKeeper.add(
Icon(Icons.circle_outlined, color: Colors.red),
);
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => QuestionPage(
scoreKeeper: scoreKeeper,
setState: quizList,
correctAnswerCount: correctAnswerCount)));
}
}),
Row(children: scoreKeeper)
],
);
}
}
score_page.dart:
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:quizzler/components/eachScore.dart';
import 'package:quizzler/components/next_question_button.dart';
import 'package:quizzler/quiz_list.dart';
import 'package:quizzler/screens/question_page.dart';
import '../constants.dart';
class ScorePage extends StatelessWidget {
ScorePage({this.correctAnswerCount});
final int correctAnswerCount;
@override
Widget build(BuildContext context) {
return Container(
child: Column(
children: <Widget>[
Container(
child: Center(
child: Text('結果', style: kScoreText),
),
),
SizedBox(),
Container(
child: Center(
child: Text(correctAnswerCount.toString(), style: kScoreText),
),
),
NextQuestionButton(onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => QuestionPage(setState: quizList)));
}),
],
));
}
}
quiz_list.dart:
import 'package:flutter/material.dart';
import '/question_answer.dart';
class QuizList {
int _questionNumber = 0;
int _correctAnswerNumber = 0;
List<Question> _questionBank = [
Question('日本で二番目に高い山は?', '北岳'),
Question('富士山の標高は?', '3776m'),
Question('日本で一番低い山は?', '日和山'),
Question('日本で一番低い山の高さは?', '3m'),
Question('100m上がるごとに何度下がる?', '約0.6℃'),
Question('日本には何座の山があるといわれている?', '15,000'),
Question('百名山の基準は「品格・歴史・個性」を兼ね備え、かつ原則として標高何m以上の山?', '1,500'),
Question('百名山ではないものは?', '高尾山'),
Question('47都道府県の中で一番百名山がある県は?', '長野県'),
Question('日本で現在でも山頂付近を女性禁制とする山は?', '大峰山'),
];
List<Answer> _answerBank = [
Answer('北岳', '穂高岳', '槍ヶ岳', '赤石岳'),
Answer('3446m', '3776m', '3556m', '3336m'),
Answer('天保山', '日和山', '蘇鉄山', '金時山'),
Answer('101m', '87m', '64m', '3m'),
Answer('約0.6℃', '約0.3℃', '約0.2℃', '下がらない'),
Answer('10,000', '800', '15,000', '1,000'),
Answer('1,500', '1,000', '1,200', '1,300'),
Answer('両神山', '雲取山', '高尾山', '筑波山'),
Answer('山梨県', '長野県', '熊本県', '北海道'),
Answer('蔵王山', '駒ヶ岳', '大峰山', '乗鞍岳'),
];
List<Explanation> _explanationBank = [
Explanation('日本で二番目に高い山は南アルプスに位置する北岳です。3193.2mで火山ではない山としては日本で一番の高さです。'),
Explanation('解説Q2'),
Explanation('解説Q3'),
Explanation('解説Q4'),
Explanation('解説Q5'),
Explanation('解説Q6'),
Explanation('解説Q7'),
Explanation('解説Q8'),
Explanation('解説Q9'),
Explanation('解説Q10'),
];
void nextQuestion() {
if (_questionNumber < _questionBank.length) {
_questionNumber++;
}
}
int correctAnswerCount() {
return _correctAnswerNumber++;
}
bool isFinished() {
if (_questionNumber == 5) {
return true;
} else {
return false;
}
}
String getQuestionText() {
return _questionBank[_questionNumber].questionText;
}
String getQuestionAnswer() {
return _questionBank[_questionNumber].questionAnswer;
}
String getAnswer1() {
return _answerBank[_questionNumber].answerText1;
}
String getAnswer2() {
return _answerBank[_questionNumber].answerText2;
}
String getAnswer3() {
return _answerBank[_questionNumber].answerText3;
}
String getAnswer4() {
return _answerBank[_questionNumber].answerText4;
}
String getExplanation() {
return _explanationBank[_questionNumber - 1].explanationText;
}
}
解决方案
推荐阅读
- java - 如何调用 AWS Lambda 函数的 ssl 端点
- swift - iOS UILabel textColor 在深色模式下不更新
- tensorflow - 了解模型训练日志语句
- python - 使用 WebRTC 和 Python 服务器进行人脸情绪分析
- python-3.x - PyQt5 从子小部件访问数据以打印在父窗口上
- reactjs - 将 react 本机项目上传到 git hub 存储库的正确过程是什么?
- ubuntu - 在 Ubuntu 上将 Jhipster 项目作为 jar 运行,并且在登录时需要 HTTPS
- audio - FFMPEG 音频规范化器 dynaudnorm 对 amix 没有影响
- laravel - 如何使用 Eloquent 按顺序列出父模型及其子表?
- python - 我可以分享不同轴上多个熊猫图的传说吗?