Не могу отобразить choice_text из sqlite на моей странице quiz_screenAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Не могу отобразить choice_text из sqlite на моей странице quiz_screen

Сообщение Anonymous »

Вот мой код 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»