MIF_E31222888/lib/pages/pemula/materi/test_page.dart

147 lines
4.1 KiB
Dart

import 'package:flutter/material.dart';
class TestPage extends StatefulWidget {
final List<dynamic> soal;
const TestPage({super.key, required this.soal});
@override
State<TestPage> createState() => _TestPageState();
}
class _TestPageState extends State<TestPage> {
int currentQuestionIndex = 0;
int score = 0;
bool isAnswered = false;
late List<String> allAnswers; // Simpan daftar jawaban yang sudah diacak
@override
void initState() {
super.initState();
// Acak jawaban hanya sekali saat widget pertama kali dibangun
_shuffleAnswers();
}
void _shuffleAnswers() {
final currentQuestion = widget.soal[currentQuestionIndex];
allAnswers = [
currentQuestion['jawaban'],
...currentQuestion['jawabanSalah']
]..shuffle(); // Acak urutan jawaban
}
void _checkAnswer(String selectedAnswer, String correctAnswer) {
setState(() {
isAnswered = true;
if (selectedAnswer == correctAnswer) {
score++;
}
});
}
void _nextQuestion() {
setState(() {
if (currentQuestionIndex < widget.soal.length - 1) {
currentQuestionIndex++;
isAnswered = false;
_shuffleAnswers(); // Acak jawaban untuk pertanyaan berikutnya
} else {
// Tampilkan hasil akhir
_showResult();
}
});
}
void _showResult() {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: const Text("Hasil Test"),
content: Text("Skor Anda: $score dari ${widget.soal.length}"),
actions: [
TextButton(
onPressed: () {
Navigator.pop(context);
Navigator.pop(context); // Kembali ke halaman sebelumnya
},
child: const Text("Selesai"),
),
],
);
},
);
}
@override
Widget build(BuildContext context) {
if (widget.soal.isEmpty) {
return const Scaffold(
body: Center(
child: Text("Tidak ada soal yang tersedia."),
),
);
}
final currentQuestion = widget.soal[currentQuestionIndex];
return Scaffold(
appBar: AppBar(
title: const Text('Test Page'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"Pertanyaan ${currentQuestionIndex + 1}/${widget.soal.length}",
style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
),
const SizedBox(height: 16),
Text(
currentQuestion['pertanyaan'],
style: const TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
),
const SizedBox(height: 32),
...allAnswers.map((answer) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 8.0),
child: ElevatedButton(
onPressed: isAnswered
? null
: () => _checkAnswer(answer, currentQuestion['jawaban']),
style: ElevatedButton.styleFrom(
minimumSize: const Size(double.infinity, 50),
backgroundColor: isAnswered
? (answer == currentQuestion['jawaban']
? Colors.green
: Colors.red)
: null,
),
child: Text(
answer,
style: const TextStyle(fontSize: 18),
),
),
);
}).toList(),
const SizedBox(height: 32),
if (isAnswered)
Center(
child: ElevatedButton(
onPressed: _nextQuestion,
child: Text(
currentQuestionIndex < widget.soal.length - 1
? "Pertanyaan Berikutnya"
: "Lihat Hasil",
),
),
),
],
),
),
);
}
}