Quiz: Schermata dei risultati
Fa parte della sezione Progetti del percorso Flutter di Coddy. Lezione 16 di 36.
Quando viene data una risposta all'ultima domanda, il quiz dovrebbe terminare con una schermata dedicata che mostri il tuo risultato. Si tratta di un secondo widget, ResultsScreen, e Navigator.push ti porta lì.
La schermata dei risultati ha bisogno di due numeri: il punteggio e il numero di domande. Li riceve tramite il costruttore, come parametri denominati required:
class ResultsScreen extends StatelessWidget {
const ResultsScreen({super.key, required this.score, required this.total});
final int score;
final int total;
...
}All'ultima domanda, il pulsante mostra «Vedi i risultati» invece di «Avanti». Lo stesso metodo _next gestisce entrambi i casi: all'ultima domanda mostra la schermata dei risultati e termina, così l'indice non supera mai la fine dell'elenco.
if (_isLast) {
Navigator.push(context, MaterialPageRoute(
builder: (context) => ResultsScreen(score: _score, total: questions.length),
));
return;
}Sfida
MedioTermina il quiz con una schermata dei risultati:
- scrivi una
ResultsScreencon unoScaffold, unAppBarintitolatoResultse, al centro con 24 pixel di spaziatura interna,You scored 3 out of 5(con i numeri effettivi) nello stileheadlineSmalldel tema - mostra il pulsante dopo ogni risposta, con l'etichetta
See resultssull'ultima domanda eNextsulle altre - all'ultima domanda,
_nextapre la schermata dei risultati
Provalo tu
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
),
home: const QuizScreen(),
);
}
}
class Question {
const Question(this.text, this.answers, this.correct);
final String text;
final List<String> answers;
final int correct;
}
const List<Question> questions = [
Question('Which widget stacks its children from top to bottom?', ['Row', 'Column', 'Stack', 'Wrap'], 1),
Question('Which language do you write Flutter apps in?', ['Kotlin', 'Swift', 'Dart', 'JavaScript'], 2),
Question('What does setState do?', ['Rebuilds the widget', 'Saves the app', 'Closes the screen', 'Plays a sound'], 0),
Question('Which widget shows a list you can scroll?', ['Container', 'SizedBox', 'Padding', 'ListView'], 3),
Question('Which widget adds space around its child?', ['Padding', 'Center', 'Icon', 'Text'], 0),
];
class QuizScreen extends StatefulWidget {
const QuizScreen({super.key});
@override
State<QuizScreen> createState() => _QuizScreenState();
}
class _QuizScreenState extends State<QuizScreen> {
int _index = 0;
int? _picked;
int _score = 0;
Question get _question => questions[_index];
bool get _answered => _picked != null;
bool get _isLast => _index == questions.length - 1;
void _pick(int answer) {
if (_answered) return;
setState(() {
_picked = answer;
if (answer == _question.correct) {
_score++;
}
});
}
void _next() {
setState(() {
_index++;
_picked = null;
});
}
Color? _colorFor(int answer) {
if (!_answered) return null;
if (answer == _question.correct) return Colors.green;
if (answer == _picked) return Colors.red;
return null;
}
@override
Widget build(BuildContext context) {
final question = _question;
final textTheme = Theme.of(context).textTheme;
return Scaffold(
appBar: AppBar(
title: const Text('Flutter Quiz'),
actions: [
Padding(
padding: const EdgeInsets.only(right: 16),
child: Center(
child: Text('Score: $_score', style: textTheme.titleMedium),
),
),
],
),
body: Padding(
padding: const EdgeInsets.all(24),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Text(
'Question ${_index + 1} of ${questions.length}',
style: textTheme.labelLarge,
),
const SizedBox(height: 8),
LinearProgressIndicator(
value: (_index + 1) / questions.length,
minHeight: 8,
borderRadius: BorderRadius.circular(4),
),
const SizedBox(height: 24),
Text(question.text, style: textTheme.headlineSmall),
const SizedBox(height: 24),
for (int i = 0; i < question.answers.length; i++)
Padding(
padding: const EdgeInsets.only(bottom: 12),
child: FilledButton.tonal(
style: FilledButton.styleFrom(
backgroundColor: _colorFor(i),
foregroundColor: _colorFor(i) == null ? null : Colors.white,
padding: const EdgeInsets.all(16),
),
onPressed: () => _pick(i),
child: Text(question.answers[i]),
),
),
if (_answered) ...[
const SizedBox(height: 12),
Text(
_picked == question.correct
? 'Correct!'
: 'The answer is ${question.answers[question.correct]}',
textAlign: TextAlign.center,
style: textTheme.titleMedium,
),
const SizedBox(height: 16),
if (!_isLast)
FilledButton(
onPressed: _next,
child: const Text('Next'),
),
],
],
),
),
);
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Progetti
1Progetto: Lista delle cose da fare
Lista delle cose da fare: l’elenco delle attivitàLista delle cose da fare: aggiungere un’attività4Progetto: Tracker delle abitudini
Tracker delle abitudini: le tue abitudiniTracker delle abitudini: la settimanaEsercitati da solo: Compilatore Flutter online