Anonymous
Не могу отобразить choice_text из sqlite на моей странице quiz_screen
Сообщение
Anonymous » 27 май 2024, 09:45
Вот мой код quiz_screen.dart, в котором я хочу отображать вопросы и варианты выбора:
Код: Выделить всё
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 createState() => _QuizScreenState();
}
class _QuizScreenState extends State {
late Future _futureQuestions;
Map _selectedChoice = {};
@override
void initState() {
super.initState();
_futureQuestions = fetchQuestionAndChoice();
}
void _selectChoice(int questionId, int choiceId){
setState(() {
_selectedChoice[questionId] = choiceId;
});
}
int _calculateScore(List 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 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"))
],
);
}
}),
);
}
}
А это мой файл data_services:
Код: Выделить всё
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 get database async {
if (_database != null) return _database!;
_database = await _initDB();
return _database!;
}
Future _initDB() async {
String path = join(await getDatabasesPath(), 'quiz_app.db');
return await openDatabase(
path,
onCreate: _onCreate,
version: 1,
);
}
Future _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 insertQuestion(Map question) async {
final db = await database;
return await db.insert('questions', question);
}
Future insertChoice(Map choice) async {
final db = await database;
await db.insert('choices', choice);
}
Future getQuestions() async {
final db = await database;
return await db.query('questions');
}
Future getChoices(int questionId) async {
final db = await database;
return await db.query('choices', where: 'question_id = ?', whereArgs: [questionId]);
}
Future insertScore(Map score) async {
final db = await database;
await db.insert('user_scores', score);
}
Future clearData() async{
final db = await database;
await db.delete('questions');
await db.delete('choices');
await db.delete('user_scores');
}
}
Я не могу отображать текст выбора рядом с этими переключателями. Он отображается пустым, вот так:
(
https://i.sstatic.net/TMW6paUJ.png )
Я попробовал и проверил все пути потока данных, и я не могу понять, в чем может быть проблема. ChatGPT не помогает
Подробнее здесь:
https://stackoverflow.com/questions/785 ... creen-page
1716792307
Anonymous
Вот мой код quiz_screen.dart, в котором я хочу отображать вопросы и варианты выбора: [code]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 createState() => _QuizScreenState(); } class _QuizScreenState extends State { late Future _futureQuestions; Map _selectedChoice = {}; @override void initState() { super.initState(); _futureQuestions = fetchQuestionAndChoice(); } void _selectChoice(int questionId, int choiceId){ setState(() { _selectedChoice[questionId] = choiceId; }); } int _calculateScore(List 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 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")) ], ); } }), ); } } [/code] А это мой файл data_services: [code]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 get database async { if (_database != null) return _database!; _database = await _initDB(); return _database!; } Future _initDB() async { String path = join(await getDatabasesPath(), 'quiz_app.db'); return await openDatabase( path, onCreate: _onCreate, version: 1, ); } Future _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 insertQuestion(Map question) async { final db = await database; return await db.insert('questions', question); } Future insertChoice(Map choice) async { final db = await database; await db.insert('choices', choice); } Future getQuestions() async { final db = await database; return await db.query('questions'); } Future getChoices(int questionId) async { final db = await database; return await db.query('choices', where: 'question_id = ?', whereArgs: [questionId]); } Future insertScore(Map score) async { final db = await database; await db.insert('user_scores', score); } Future clearData() async{ final db = await database; await db.delete('questions'); await db.delete('choices'); await db.delete('user_scores'); } } [/code] Я не могу отображать текст выбора рядом с этими переключателями. Он отображается пустым, вот так: (https://i.sstatic.net/TMW6paUJ.png) Я попробовал и проверил все пути потока данных, и я не могу понять, в чем может быть проблема. ChatGPT не помогает Подробнее здесь: [url]https://stackoverflow.com/questions/78537525/cant-display-choice-text-from-sqlite-to-my-quiz-screen-page[/url]