基础界面代码
void main() => runApp(Quizzler());
class Quizzler extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
backgroundColor: Colors.grey.shade900,
body: SafeArea(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 10.0),
child: QuizPage(),
),
),
),
);
}
}
class QuizPage extends StatefulWidget {
_QuizPageState createState() => _QuizPageState();
}
class _QuizPageState extends State<QuizPage> {
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
const Expanded(
flex: 5,
child: Padding(
padding: EdgeInsets.all(10.0),
child: Center(
child: Text(
'This is where the question text will go.',
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 25.0,
color: Colors.white,
),
),
),
),
),
Expanded(
child: Padding(
padding: const EdgeInsets.all(15.0),
child: TextButton(
style: TextButton.styleFrom(
backgroundColor: Colors.green,
),
child: const Text(
'True',
style: TextStyle(
color: Colors.white,
fontSize: 20.0,
),
),
onPressed: () {
//The user picked true.
},
),
),
),
Expanded(
child: Padding(
padding: const EdgeInsets.all(15.0),
child: TextButton(
style: TextButton.styleFrom(
backgroundColor: Colors.red,
),
child: const Text(
'False',
style: TextStyle(
fontSize: 20.0,
color: Colors.white,
),
),
onPressed: () {
//The user picked false.
},
),
),
),
//TODO: Add a Row here as your score keeper
],
);
}
}
/*
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,
*/
使用list(记分员)动态添加图标
创建一个list,在三角括号中写入Icon类,表明这个列表只能接收Icon类。
在类中定义几个Icon。
List<Icon> scoreKeeper = [
const Icon(
Icons.check,
color: Colors.green,
),
const Icon(
Icons.close,
color: Colors.red,
),
];
点击正确的按钮会向其中添加一个对号,并展示在屏幕上。使用scoreKeeper.add方法添加一个图标。
Expanded(
child: Padding(
padding: const EdgeInsets.all(15.0),
child: TextButton(
style: TextButton.styleFrom(
backgroundColor: Colors.green,
),
child: const Text(
'True',
style: TextStyle(
color: Colors.white,
fontSize: 20.0,
),
),
onPressed: () {
//The user picked true.
setState(() {
scoreKeeper.add(
const Icon(
Icons.check,
color: Colors.green,
),
);
});
},
),
),
),
完整参考代码
void main() => runApp(Quizzler());
class Quizzler extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
backgroundColor: Colors.grey.shade900,
body: SafeArea(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 10.0),
child: QuizPage(),
),
),
),
);
}
}
class QuizPage extends StatefulWidget {
_QuizPageState createState() => _QuizPageState();
}
class _QuizPageState extends State<QuizPage> {
List<Icon> scoreKeeper = [
const Icon(
Icons.check,
color: Colors.green,
),
const Icon(
Icons.close,
color: Colors.red,
),
];
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
const Expanded(
flex: 5,
child: Padding(
padding: EdgeInsets.all(10.0),
child: Center(
child: Text(
'This is where the question text will go.',
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 25.0,
color: Colors.white,
),
),
),
),
),
Expanded(
child: Padding(
padding: const EdgeInsets.all(15.0),
child: TextButton(
style: TextButton.styleFrom(
backgroundColor: Colors.green,
),
child: const Text(
'True',
style: TextStyle(
color: Colors.white,
fontSize: 20.0,
),
),
onPressed: () {
//The user picked true.
setState(() {
scoreKeeper.add(
const Icon(
Icons.check,
color: Colors.green,
),
);
});
},
),
),
),
Expanded(
child: Padding(
padding: const EdgeInsets.all(15.0),
child: TextButton(
style: TextButton.styleFrom(
backgroundColor: Colors.red,
),
child: const Text(
'False',
style: TextStyle(
fontSize: 20.0,
color: Colors.white,
),
),
onPressed: () {
//The user picked false.
},
),
),
),
Row(
children: scoreKeeper,
)
//TODO: Add a Row here as your score keeper
],
);
}
}
判断答案是否正确
在类中添加一个答案列表
List<bool> answers = [
false,
true,
true,
];
在按钮中判断答案是否正确
在正确的按钮中,如果输入正确,则在控制台输出正确,错误的按钮相反。
bool correctAnswer = answers[questionNumber];
if (correctAnswer == true) {
print('user got it right');
} else {
print('user got it wrong');
}
创建一个问题(Question)类
使用问题类,把问题和答案组织到一起,而不是使用两个列表。
class Question {
String questionText = '';
bool questionAnswer = false;
Question(String q, bool a) {
questionText = q;
questionAnswer = a;
}
}
在main.dart中使用
导入这个类
import 'question.dart';
创建一个list
List<Question> questionBank = [
Question('You can lead a cow down stairs but not up stairs.', false),
Question('Approximately one quarter of human bones are in the feet.', true),
Question('A slug\'s blood is green.', true),
];
替换原来的问题和答案为
questionBank[questionNumber].questionText,
questionBank[questionNumber].questionAnswer,
完整代码
import 'question.dart';
void main() => runApp(Quizzler());
class Quizzler extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
backgroundColor: Colors.grey.shade900,
body: SafeArea(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 10.0),
child: QuizPage(),
),
),
),
);
}
}
class QuizPage extends StatefulWidget {
_QuizPageState createState() => _QuizPageState();
}
class _QuizPageState extends State<QuizPage> {
List<Icon> scoreKeeper = [
const Icon(
Icons.check,
color: Colors.green,
),
const Icon(
Icons.close,
color: Colors.red,
),
];
List<Question> questionBank = [
Question('You can lead a cow down stairs but not up stairs.', false),
Question('Approximately one quarter of human bones are in the feet.', true),
Question('A slug\'s blood is green.', true),
];
int questionNumber = 0;
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Expanded(
flex: 5,
child: Padding(
padding: const EdgeInsets.all(10.0),
child: Center(
child: Text(
questionBank[questionNumber].questionText,
textAlign: TextAlign.center,
style: const TextStyle(
fontSize: 25.0,
color: Colors.white,
),
),
),
),
),
Expanded(
child: Padding(
padding: const EdgeInsets.all(15.0),
child: TextButton(
style: TextButton.styleFrom(
backgroundColor: Colors.green,
),
child: const Text(
'True',
style: TextStyle(
color: Colors.white,
fontSize: 20.0,
),
),
onPressed: () {
//The user picked true.
bool correctAnswer =
questionBank[questionNumber].questionAnswer;
if (correctAnswer == true) {
print('user got it right');
} else {
print('user got it wrong');
}
setState(() {
questionNumber = questionNumber + 1;
scoreKeeper.add(
const Icon(
Icons.check,
color: Colors.green,
),
);
});
},
),
),
),
Expanded(
child: Padding(
padding: const EdgeInsets.all(15.0),
child: TextButton(
style: TextButton.styleFrom(
backgroundColor: Colors.red,
),
child: const Text(
'False',
style: TextStyle(
fontSize: 20.0,
color: Colors.white,
),
),
onPressed: () {
//The user picked false.
bool correctAnswer =
questionBank[questionNumber].questionAnswer;
if (correctAnswer == false) {
print('user got it right');
} else {
print('user got it wrong');
}
setState(() {
questionNumber = questionNumber + 1;
});
},
),
),
),
Row(
children: scoreKeeper,
)
//TODO: Add a Row here as your score keeper
],
);
}
}
创建一个QuizBrain类
用来管理自己问题库
import 'package:quizme/question.dart';
class QuizBrain {
List<Question> questionBank = [
Question('Some cats are actually allergic to humans', true),
Question('You can lead a cow down stairs but not up stairs.', false),
Question('Approximately one quarter of human bones are in the feet.', true),
Question('A slug\'s blood is green.', true),
Question('Buzz Aldrin\'s mother\'s maiden name was \"Moon\".', true),
Question('It is illegal to pee in the Ocean in Portugal.', true),
Question(
'No piece of square dry paper can be folded in half more than 7 times.',
false),
Question(
'In London, UK, if you happen to die in the House of Parliament, you are technically entitled to a state funeral, because the building is considered too sacred a place.',
true),
Question(
'The loudest sound produced by any animal is 188 decibels. That animal is the African Elephant.',
false),
Question(
'The total surface area of two human lungs is approximately 70 square metres.',
true),
Question('Google was originally called \"Backrub\".', true),
Question(
'Chocolate affects a dog\'s heart and nervous system; a few ounces are enough to kill a small dog.',
true),
Question(
'In West Virginia, USA, if you accidentally hit an animal with your car, you are free to take it home to eat.',
true),
];
}
在main.dart 中使用
创建一个问题库对象
QuizBrain quizBrain = QuizBrain();
使用问题库中的问题和答案
quizBrain.questionBank[questionNumber].questionText,
quizBrain.questionBank[questionNumber].questionAnswer;
完整的参考代码
mport 'package:quizme/quiz_brain.dart';
import 'question.dart';
QuizBrain quizBrain = QuizBrain();
void main() => runApp(Quizzler());
class Quizzler extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
backgroundColor: Color.fromARGB(255, 136, 94, 94),
body: SafeArea(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 10.0),
child: QuizPage(),
),
),
),
);
}
}
class QuizPage extends StatefulWidget {
_QuizPageState createState() => _QuizPageState();
}
class _QuizPageState extends State<QuizPage> {
List<Icon> scoreKeeper = [
const Icon(
Icons.check,
color: Colors.green,
),
const Icon(
Icons.close,
color: Colors.red,
),
];
List<Question> questionBank = [
Question('You can lead a cow down stairs but not up stairs.', false),
Question('Approximately one quarter of human bones are in the feet.', true),
Question('A slug\'s blood is green.', true),
];
int questionNumber = 0;
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Expanded(
flex: 5,
child: Padding(
padding: const EdgeInsets.all(10.0),
child: Center(
child: Text(
quizBrain.questionBank[questionNumber].questionText,
textAlign: TextAlign.center,
style: const TextStyle(
fontSize: 25.0,
color: Colors.white,
),
),
),
),
),
Expanded(
child: Padding(
padding: const EdgeInsets.all(15.0),
child: TextButton(
style: TextButton.styleFrom(
backgroundColor: Colors.green,
),
child: const Text(
'True',
style: TextStyle(
color: Colors.white,
fontSize: 20.0,
),
),
onPressed: () {
//The user picked true.
bool correctAnswer =
quizBrain.questionBank[questionNumber].questionAnswer;
if (correctAnswer == true) {
print('user got it right');
} else {
print('user got it wrong');
}
setState(() {
questionNumber = questionNumber + 1;
scoreKeeper.add(
const Icon(
Icons.check,
color: Colors.green,
),
);
});
},
),
),
),
Expanded(
child: Padding(
padding: const EdgeInsets.all(15.0),
child: TextButton(
style: TextButton.styleFrom(
backgroundColor: Colors.red,
),
child: const Text(
'False',
style: TextStyle(
fontSize: 20.0,
color: Colors.white,
),
),
onPressed: () {
//The user picked false.
bool correctAnswer =
quizBrain.questionBank[questionNumber].questionAnswer;
if (correctAnswer == false) {
print('user got it right');
} else {
print('user got it wrong');
}
setState(() {
questionNumber = questionNumber + 1;
});
},
),
),
),
Row(
children: scoreKeeper,
)
//TODO: Add a Row here as your score keeper
],
);
}
}
封装数据
在属性名前面添加一个下划线,将数据私有化
int _questionNumber = 0;
List<Question> _questionBank = [];
获取数据,nextQuestion() 方法获得下一个数据,可以防止数据越界。
void nextQuestion() {
if (_questionNumber < _questionBank.length - 1) {
_questionNumber++;
}
print(_questionNumber);
print(_questionBank.length);
}
String getQuestionText() {
return _questionBank[_questionNumber].questionText;
}
bool getCorrectAnswer() {
return _questionBank[_questionNumber].questionAnswer;
}
判断答案是正确,添加图标
void checkAnswer(bool userPickedAnswer) {
bool correctAnswer = quizBrain.getCorrectAnswer();
if (userPickedAnswer == correctAnswer) {
scoreKeeper.add(
const Icon(
Icons.check,
color: Colors.green,
),
);
} else {
scoreKeeper.add(
const Icon(
Icons.close,
color: Colors.red,
),
);
}
setState(() {
quizBrain.nextQuestion();
});
}
使用rflutter_alert库
在回答完最后一个问题后,提示一个弹窗,点击关闭或者取消之后,清空记分员,回到第一个问题。
安装库
在yaml中添加依赖,在main.dart
中导入这个库。
依赖地址
提示一个弹窗
Alert(
context: context,
title: "Finished!",
desc: "You've reached the end of the quiz.",
).show();
在QuizBrain中提供两个方法
这个两个方法用来判断数据是否完成和重置编号,
因为数据被封装。
bool isFinished() {
if (_questionNumber == _questionBank.length - 1) {
return true;
}
return false;
}
void reset() {
_questionNumber = 0;
}
修改checkAnswer代码
如果到最后一个问题,清空记分员,重置编号。
setState(() {
quizBrain.nextQuestion();
if (quizBrain.isFinished()) {
Alert(
context: context,
title: "Finished!",
desc: "You've reached the end of the quiz.",
).show();
quizBrain.reset();
scoreKeeper = [];
}
});
完整代码
import 'package:quizme/quiz_brain.dart';
import 'package:rflutter_alert/rflutter_alert.dart';
import 'question.dart';
QuizBrain quizBrain = QuizBrain();
void main() => runApp(Quizzler());
class Quizzler extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
backgroundColor: const Color.fromARGB(255, 136, 94, 94),
body: SafeArea(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 10.0),
child: QuizPage(),
),
),
),
);
}
}
class QuizPage extends StatefulWidget {
_QuizPageState createState() => _QuizPageState();
}
class _QuizPageState extends State<QuizPage> {
List<Icon> scoreKeeper = [
const Icon(
Icons.check,
color: Colors.green,
),
const Icon(
Icons.close,
color: Colors.red,
),
];
List<Question> questionBank = [
Question('You can lead a cow down stairs but not up stairs.', false),
Question('Approximately one quarter of human bones are in the feet.', true),
Question('A slug\'s blood is green.', true),
];
void checkAnswer(bool userPickedAnswer) {
bool correctAnswer = quizBrain.getCorrectAnswer();
if (userPickedAnswer == correctAnswer) {
scoreKeeper.add(
const Icon(
Icons.check,
color: Colors.green,
),
);
} else {
scoreKeeper.add(
const Icon(
Icons.close,
color: Colors.red,
),
);
}
setState(() {
quizBrain.nextQuestion();
if (quizBrain.isFinished()) {
Alert(
context: context,
title: "Finished!",
desc: "You've reached the end of the quiz.",
).show();
quizBrain.reset();
scoreKeeper = [];
}
});
}
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Expanded(
flex: 5,
child: Padding(
padding: const EdgeInsets.all(10.0),
child: Center(
child: Text(
quizBrain.getQuestionText(),
textAlign: TextAlign.center,
style: const TextStyle(
fontSize: 25.0,
color: Colors.white,
),
),
),
),
),
Expanded(
child: Padding(
padding: const EdgeInsets.all(15.0),
child: TextButton(
style: TextButton.styleFrom(
backgroundColor: Colors.green,
),
child: const Text(
'True',
style: TextStyle(
color: Colors.white,
fontSize: 20.0,
),
),
onPressed: () {
//The user picked true.
checkAnswer(true);
},
),
),
),
Expanded(
child: Padding(
padding: const EdgeInsets.all(15.0),
child: TextButton(
style: TextButton.styleFrom(
backgroundColor: Colors.red,
),
child: const Text(
'False',
style: TextStyle(
fontSize: 20.0,
color: Colors.white,
),
),
onPressed: () {
//The user picked false.
checkAnswer(false);
},
),
),
),
Row(
children: scoreKeeper,
)
//TODO: Add a Row here as your score keeper
],
);
}
}