Here’s my code of quiz_screen.dart where i want to display the questions and choices:
import 'package:flutter/material.dart';
import '../models/fetch_questions_and_choices.dart';
class QuizScreen extends StatefulWidget {
static const routeName = '/quiz';
const QuizScreen({super.key});
@override
State<QuizScreen> createState() => _QuizScreenState();
}
class _QuizScreenState extends State<QuizScreen> {
late Future<List<Question>> _futureQuestions;
Map<int, int> _selectedChoice = {};
@override
void initState() {
super.initState();
_futureQuestions = fetchQuestionAndChoice();
}
void _selectChoice(int questionId, int choiceId){
setState(() {
_selectedChoice[questionId] = choiceId;
});
}
int _calculateScore(List<Question> questions) {
int score = 0;
for (var question in questions) {
if (_selectedChoice[question.id] != null) {
Choice selectedChoice = question.choices.firstWhere(
(choice) => choice.id == _selectedChoice[question.id],
orElse: () => Choice(id: 0, questionId: question.id, choiceText: '', isCorrect: false),
);
if (selectedChoice.isCorrect) {
score++;
}
}
}
return score;
}
void _showScore(BuildContext context, int score){
showDialog(context: context, builder: (context) => AlertDialog(
title: Text('Quiz Completed!'),
content: Text('Your Score is $score'),
actions: [
TextButton(onPressed: () => Navigator.of(context).pop(), child: Text("OK"))
],
));
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Quiz'),
),
body: FutureBuilder(future: _futureQuestions, builder: (context, snapshot) {
if(snapshot.connectionState == ConnectionState.waiting){
return Center(
child: CircularProgressIndicator(),
);
}
else if(snapshot.hasError){
return Center(
child: Text('Error: ${snapshot.error}'),
);
}
else if(snapshot.data == null || snapshot.data!.isEmpty){
return Center(
child: Text('No Questions Added Yet.'),
);
}
else{
List<Question> questions = snapshot.data!;
return Column(
children: [
Expanded(
child: ListView.builder(
itemCount: questions.length,
itemBuilder: (context, i) {
Question question = questions[i];
return Card(
child: Column(
children: [
Text(
question.questionText,
style: TextStyle(
fontSize: 28,
fontWeight: FontWeight.bold
),
),
...question.choices.map(
(choice) => RadioListTile(
title: Text(choice.choiceText),
value: choice.id,
groupValue: _selectedChoice[question.id],
onChanged: (value) {
_selectChoice(question.id, value!);
}
)
)
],
),
);
},),
),
ElevatedButton(onPressed: () {
int score = _calculateScore(questions);
_showScore(context, score);
}, child: Text("Submit"))
],
);
}
}),
);
}
}
And this is my database_services file:
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
class DBHelper {
static final DBHelper _instance = DBHelper._internal();
factory DBHelper() => _instance;
static Database? _database;
DBHelper._internal();
Future<Database> get database async {
if (_database != null) return _database!;
_database = await _initDB();
return _database!;
}
Future<Database> _initDB() async {
String path = join(await getDatabasesPath(), 'quiz_app.db');
return await openDatabase(
path,
onCreate: _onCreate,
version: 1,
);
}
Future<void> _onCreate(Database db, int version) async {
await db.execute('''
CREATE TABLE questions (
id INTEGER PRIMARY KEY,
question_text TEXT
)
''');
await db.execute('''
CREATE TABLE choices (
id INTEGER PRIMARY KEY,
question_id INTEGER,
choice_text TEXT,
is_correct INTEGER,
FOREIGN KEY (question_id) REFERENCES questions (id)
)
''');
await db.execute('''
CREATE TABLE user_scores (
id INTEGER PRIMARY KEY,
user_id INTEGER,
score INTEGER
)
''');
}
Future<int> insertQuestion(Map<String, dynamic> question) async {
final db = await database;
return await db.insert('questions', question);
}
Future<void> insertChoice(Map<String, dynamic> choice) async {
final db = await database;
await db.insert('choices', choice);
}
Future<List<Map<String, dynamic>>> getQuestions() async {
final db = await database;
return await db.query('questions');
}
Future<List<Map<String, dynamic>>> getChoices(int questionId) async {
final db = await database;
return await db.query('choices', where: 'question_id = ?', whereArgs: [questionId]);
}
Future<void> insertScore(Map<String, dynamic> score) async {
final db = await database;
await db.insert('user_scores', score);
}
Future<void> clearData() async{
final db = await database;
await db.delete('questions');
await db.delete('choices');
await db.delete('user_scores');
}
}
I can’t display choice texts beside those radio buttons. It displays just as blank, like this:
(https://i.sstatic.net/TMW6paUJ.png)
I tried and checked all data-flow paths and i can’t figure out where the issue may be. ChatGPT isn’t helping
New contributor
Nityam Joshi is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.