Atulização do quiz | Porcentagem na base de dados | Telas de Contrato com o usuario
This commit is contained in:
@@ -1,7 +1,42 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'quiz_checklist_screen.dart';
|
||||
import 'quiz_question_screen.dart';
|
||||
import 'quiz_result.dart';
|
||||
import 'quiz_video_guide.dart';
|
||||
|
||||
/// Recorta/zoom numa zona específica de uma foto de rosto (ex.: só a zona
|
||||
/// dos olhos), também sem precisar de um novo ficheiro de imagem.
|
||||
Widget _zoomCrop(String path, {Alignment alignment = Alignment.center, double scale = 2.0}) {
|
||||
return ClipRect(
|
||||
child: Transform.scale(
|
||||
scale: scale,
|
||||
alignment: alignment,
|
||||
child: Image.asset(path, fit: BoxFit.cover),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/// Rota inicial do quiz: mostra primeiro o ecrã de checklist explicativo,
|
||||
/// só depois a pergunta 1 — usada em todos os pontos de entrada do quiz
|
||||
/// em vez de navegar diretamente para [Quiz1Screen].
|
||||
MaterialPageRoute<void> quizStartRoute({String? scopeId}) {
|
||||
return MaterialPageRoute<void>(
|
||||
builder: (_) => QuizChecklistScreen(
|
||||
heading: 'Vamos ajudá-lo/a a compreender:',
|
||||
items: const [
|
||||
'Sinais de alerta podem passar despercebidos',
|
||||
'Prevenir é melhor do que tratar',
|
||||
'Quando deve procurar um dentista (urgência vs vigilância)',
|
||||
],
|
||||
onAdvance: (context) => Navigator.of(context).pushReplacement(
|
||||
MaterialPageRoute<void>(
|
||||
builder: (_) => Quiz1Screen(scopeId: scopeId),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
// Quiz 1: Problemas respiratórios (Yes/No)
|
||||
class Quiz1Screen extends StatelessWidget {
|
||||
@@ -13,7 +48,7 @@ class Quiz1Screen extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return QuizQuestionScreen(
|
||||
title: 'Quiz 1/23',
|
||||
title: 'Quiz 1/26',
|
||||
category: 'Saúde respiratória',
|
||||
categoryIcon: Icons.medical_information_rounded,
|
||||
fallbackIcon: Icons.medical_information_rounded,
|
||||
@@ -60,7 +95,7 @@ class Quiz2Screen extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return QuizQuestionScreen(
|
||||
title: 'Quiz 2/23',
|
||||
title: 'Quiz 2/26',
|
||||
category: 'Respiração',
|
||||
categoryIcon: Icons.air_rounded,
|
||||
fallbackIcon: Icons.air_rounded,
|
||||
@@ -107,7 +142,7 @@ class Quiz3Screen extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return QuizQuestionScreen(
|
||||
title: 'Quiz 3/23',
|
||||
title: 'Quiz 3/26',
|
||||
category: 'Sono',
|
||||
categoryIcon: Icons.bedtime_rounded,
|
||||
fallbackIcon: Icons.bedtime_rounded,
|
||||
@@ -154,7 +189,7 @@ class Quiz4Screen extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return QuizQuestionScreen(
|
||||
title: 'Quiz 4/23',
|
||||
title: 'Quiz 4/26',
|
||||
category: 'Respiração',
|
||||
categoryIcon: Icons.sick_rounded,
|
||||
fallbackIcon: Icons.sick_rounded,
|
||||
@@ -201,7 +236,7 @@ class Quiz5Screen extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return QuizQuestionScreen(
|
||||
title: 'Quiz 5/23',
|
||||
title: 'Quiz 5/26',
|
||||
category: 'Sono',
|
||||
categoryIcon: Icons.nights_stay_rounded,
|
||||
fallbackIcon: Icons.nights_stay_rounded,
|
||||
@@ -250,7 +285,7 @@ class Quiz6Screen extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return QuizQuestionScreen(
|
||||
title: 'Quiz 6/23',
|
||||
title: 'Quiz 6/26',
|
||||
category: 'Hábitos noturnos',
|
||||
categoryIcon: Icons.nights_stay_rounded,
|
||||
fallbackIcon: Icons.nights_stay_rounded,
|
||||
@@ -290,7 +325,7 @@ class Quiz7Screen extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return QuizQuestionScreen(
|
||||
title: 'Quiz 7/23',
|
||||
title: 'Quiz 7/26',
|
||||
category: 'Saúde geral',
|
||||
categoryIcon: Icons.local_florist_rounded,
|
||||
fallbackIcon: Icons.local_florist_rounded,
|
||||
@@ -337,7 +372,7 @@ class Quiz8Screen extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return QuizQuestionScreen(
|
||||
title: 'Quiz 8/23',
|
||||
title: 'Quiz 8/26',
|
||||
category: 'Sono',
|
||||
categoryIcon: Icons.water_drop_rounded,
|
||||
fallbackIcon: Icons.water_drop_rounded,
|
||||
@@ -384,7 +419,7 @@ class Quiz9Screen extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return QuizQuestionScreen(
|
||||
title: 'Quiz 9/23',
|
||||
title: 'Quiz 9/26',
|
||||
category: 'Saúde geral',
|
||||
categoryIcon: Icons.hearing_rounded,
|
||||
fallbackIcon: Icons.hearing_rounded,
|
||||
@@ -431,7 +466,7 @@ class Quiz10Screen extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return QuizQuestionScreen(
|
||||
title: 'Quiz 10/23',
|
||||
title: 'Quiz 10/26',
|
||||
category: 'Saúde geral',
|
||||
categoryIcon: Icons.healing_rounded,
|
||||
fallbackIcon: Icons.healing_rounded,
|
||||
@@ -478,7 +513,7 @@ class Quiz11Screen extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return QuizQuestionScreen(
|
||||
title: 'Quiz 11/23',
|
||||
title: 'Quiz 11/26',
|
||||
category: 'Saúde respiratória',
|
||||
categoryIcon: Icons.air_rounded,
|
||||
fallbackIcon: Icons.air_rounded,
|
||||
@@ -526,7 +561,7 @@ class Quiz12Screen extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return QuizQuestionScreen(
|
||||
title: 'Quiz 12/23',
|
||||
title: 'Quiz 12/26',
|
||||
category: 'Hábitos alimentares',
|
||||
categoryIcon: Icons.restaurant_rounded,
|
||||
fallbackIcon: Icons.restaurant_rounded,
|
||||
@@ -566,7 +601,7 @@ class Quiz13Screen extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return QuizQuestionScreen(
|
||||
title: 'Quiz 13/23',
|
||||
title: 'Quiz 13/26',
|
||||
category: 'Hábitos alimentares',
|
||||
categoryIcon: Icons.schedule_rounded,
|
||||
fallbackIcon: Icons.schedule_rounded,
|
||||
@@ -606,7 +641,7 @@ class Quiz14Screen extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return QuizQuestionScreen(
|
||||
title: 'Quiz 14/23',
|
||||
title: 'Quiz 14/26',
|
||||
category: 'Hábitos alimentares',
|
||||
categoryIcon: Icons.restaurant_menu_rounded,
|
||||
fallbackIcon: Icons.restaurant_menu_rounded,
|
||||
@@ -646,7 +681,7 @@ class Quiz15Screen extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return QuizQuestionScreen(
|
||||
title: 'Quiz 15/23',
|
||||
title: 'Quiz 15/26',
|
||||
category: 'Hábitos alimentares',
|
||||
categoryIcon: Icons.local_drink_rounded,
|
||||
fallbackIcon: Icons.local_drink_rounded,
|
||||
@@ -693,7 +728,7 @@ class Quiz16Screen extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return QuizQuestionScreen(
|
||||
title: 'Quiz 16/23',
|
||||
title: 'Quiz 16/26',
|
||||
category: 'Hábitos orais',
|
||||
categoryIcon: Icons.child_care_rounded,
|
||||
fallbackIcon: Icons.child_care_rounded,
|
||||
@@ -740,7 +775,7 @@ class Quiz17Screen extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return QuizQuestionScreen(
|
||||
title: 'Quiz 17/23',
|
||||
title: 'Quiz 17/26',
|
||||
category: 'Hábitos orais',
|
||||
categoryIcon: Icons.back_hand_rounded,
|
||||
fallbackIcon: Icons.back_hand_rounded,
|
||||
@@ -769,7 +804,15 @@ class Quiz17Screen extends StatelessWidget {
|
||||
],
|
||||
currentScore: currentScore,
|
||||
nextRoute: (context, nextScore) => MaterialPageRoute<void>(
|
||||
builder: (_) => Quiz18Screen(currentScore: nextScore, scopeId: scopeId),
|
||||
builder: (_) => QuizVideoGuideScreen(
|
||||
youtubeId: 'W2BcK9nSyt0',
|
||||
onAdvance: (ctx) => Navigator.of(ctx).pushReplacement(
|
||||
MaterialPageRoute<void>(
|
||||
builder: (_) =>
|
||||
Quiz18Screen(currentScore: nextScore, scopeId: scopeId),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
answerType: QuizAnswerType.yesNo,
|
||||
showBackButton: true,
|
||||
@@ -777,7 +820,7 @@ class Quiz17Screen extends StatelessWidget {
|
||||
}
|
||||
}
|
||||
|
||||
// Quiz 18: Face (Image-based)
|
||||
// Quiz 18: Postura (Image-choice)
|
||||
class Quiz18Screen extends StatelessWidget {
|
||||
const Quiz18Screen({super.key, required this.currentScore, this.scopeId});
|
||||
|
||||
@@ -787,38 +830,43 @@ class Quiz18Screen extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return QuizQuestionScreen(
|
||||
title: 'Quiz 18/23',
|
||||
category: 'Avaliação facial',
|
||||
categoryIcon: Icons.face_rounded,
|
||||
question: 'O rosto do seu filho/a se parece com o desta imagem?',
|
||||
questionImagePaths: const ['assets/mockup_images/2.jpeg'],
|
||||
suggestedYoutubeId: '', // TODO: colar o ID do YouTube do Episódio 1
|
||||
suggestedVideoTitle: 'Ver vídeo: Episódio 1',
|
||||
title: 'Quiz 18/26',
|
||||
category: 'Avaliação postural',
|
||||
categoryIcon: Icons.accessibility_new_rounded,
|
||||
fallbackIcon: Icons.accessibility_new_rounded,
|
||||
fallbackColor: const Color(0xFF8E7CC3),
|
||||
answerImageAspectRatio: 1.5,
|
||||
question:
|
||||
'Qual das seguintes imagens é mais parecida com a postura do seu filho/a?',
|
||||
answers: const [
|
||||
QuizAnswer(
|
||||
title: 'Sim',
|
||||
description: 'O rosto se assemelha à imagem',
|
||||
title: 'Postura inadequada',
|
||||
description: 'Postura curvada, ombros e pescoço projetados',
|
||||
weight: 2,
|
||||
value: 'sim',
|
||||
hideTitle: true,
|
||||
value: 'postura_inadequada',
|
||||
imagePath: 'assets/mockup_images/0.1.png',
|
||||
),
|
||||
QuizAnswer(
|
||||
title: 'Não',
|
||||
description: 'O rosto não se assemelha à imagem',
|
||||
title: 'Postura correta',
|
||||
description: 'Postura ereta, coluna alinhada',
|
||||
weight: 1,
|
||||
value: 'nao',
|
||||
hideTitle: true,
|
||||
value: 'postura_correta',
|
||||
imagePath: 'assets/mockup_images/0.png',
|
||||
),
|
||||
],
|
||||
currentScore: currentScore,
|
||||
nextRoute: (context, nextScore) => MaterialPageRoute<void>(
|
||||
builder: (_) => Quiz19Screen(currentScore: nextScore, scopeId: scopeId),
|
||||
),
|
||||
answerType: QuizAnswerType.yesNo,
|
||||
answerType: QuizAnswerType.image,
|
||||
showBackButton: true,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Quiz 19: Boca (Image-based)
|
||||
// Quiz 19: Perfil (Image-choice)
|
||||
class Quiz19Screen extends StatelessWidget {
|
||||
const Quiz19Screen({super.key, required this.currentScore, this.scopeId});
|
||||
|
||||
@@ -828,39 +876,62 @@ class Quiz19Screen extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return QuizQuestionScreen(
|
||||
title: 'Quiz 19/23',
|
||||
title: 'Quiz 19/26',
|
||||
category: 'Avaliação facial',
|
||||
categoryIcon: Icons.sentiment_neutral_rounded,
|
||||
categoryIcon: Icons.face_rounded,
|
||||
fallbackIcon: Icons.face_rounded,
|
||||
fallbackColor: const Color(0xFFFF55A7),
|
||||
question:
|
||||
'A boca do seu filho/a fica habitualmente na posição desta imagem (entreaberta)?',
|
||||
questionImagePaths: const ['assets/mockup_images/4.jpeg'],
|
||||
suggestedYoutubeId: '', // TODO: colar o ID do YouTube do Episódio 2
|
||||
suggestedVideoTitle: 'Ver vídeo: Episódio 2',
|
||||
answers: const [
|
||||
'Qual das seguintes imagens é mais parecida com o perfil do seu filho/a?',
|
||||
answers: [
|
||||
QuizAnswer(
|
||||
title: 'Sim',
|
||||
description: 'A boca fica habitualmente entreaberta',
|
||||
weight: 2,
|
||||
value: 'sim',
|
||||
title: 'Perfil reto',
|
||||
description: 'Perfil facial reto',
|
||||
weight: 1,
|
||||
hideTitle: true,
|
||||
value: 'perfil_reto',
|
||||
imageBuilder: (context) => _zoomCrop(
|
||||
'assets/mockup_images/1.jpeg',
|
||||
alignment: const Alignment(0.1, 0.7),
|
||||
scale: 1.05,
|
||||
),
|
||||
),
|
||||
QuizAnswer(
|
||||
title: 'Não',
|
||||
description: 'A boca fica habitualmente fechada',
|
||||
weight: 1,
|
||||
value: 'nao',
|
||||
title: 'Perfil convexo',
|
||||
description: 'Perfil facial convexo',
|
||||
weight: 2,
|
||||
hideTitle: true,
|
||||
value: 'perfil_convexo',
|
||||
imageBuilder: (context) => _zoomCrop(
|
||||
'assets/mockup_images/2.jpeg',
|
||||
alignment: const Alignment(0.1, 0.7),
|
||||
scale: 1.05,
|
||||
),
|
||||
),
|
||||
QuizAnswer(
|
||||
title: 'Perfil côncavo',
|
||||
description: 'Perfil facial côncavo',
|
||||
weight: 2,
|
||||
hideTitle: true,
|
||||
value: 'perfil_concavo',
|
||||
imageBuilder: (context) => _zoomCrop(
|
||||
'assets/mockup_images/3.jpeg',
|
||||
alignment: const Alignment(0.1, 0.7),
|
||||
scale: 1.05,
|
||||
),
|
||||
),
|
||||
],
|
||||
currentScore: currentScore,
|
||||
nextRoute: (context, nextScore) => MaterialPageRoute<void>(
|
||||
builder: (_) => Quiz20Screen(currentScore: nextScore, scopeId: scopeId),
|
||||
),
|
||||
answerType: QuizAnswerType.yesNo,
|
||||
answerType: QuizAnswerType.image,
|
||||
showBackButton: true,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Quiz 20: Olheiras (Image-based)
|
||||
// Quiz 20: Boca habitual (Image-choice)
|
||||
class Quiz20Screen extends StatelessWidget {
|
||||
const Quiz20Screen({super.key, required this.currentScore, this.scopeId});
|
||||
|
||||
@@ -870,38 +941,52 @@ class Quiz20Screen extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return QuizQuestionScreen(
|
||||
title: 'Quiz 20/23',
|
||||
title: 'Quiz 20/26',
|
||||
category: 'Avaliação facial',
|
||||
categoryIcon: Icons.visibility_rounded,
|
||||
question: 'O seu filho/a tem olheiras semelhantes às desta imagem?',
|
||||
questionImagePaths: const ['assets/mockup_images/8.jpeg'],
|
||||
suggestedYoutubeId: '', // TODO: colar o ID do YouTube do Episódio 3
|
||||
suggestedVideoTitle: 'Ver vídeo: Episódio 3',
|
||||
categoryIcon: Icons.sentiment_neutral_rounded,
|
||||
fallbackIcon: Icons.sentiment_neutral_rounded,
|
||||
fallbackColor: const Color(0xFF2F9E94),
|
||||
question: 'Qual é a posição da boca do seu filho/a habitualmente?',
|
||||
answers: const [
|
||||
QuizAnswer(
|
||||
title: 'Sim',
|
||||
description: 'Tem olheiras semelhantes à imagem',
|
||||
weight: 2,
|
||||
value: 'sim',
|
||||
title: 'Boca fechada',
|
||||
description: 'Boca fechada habitualmente',
|
||||
weight: 1,
|
||||
hideTitle: true,
|
||||
value: 'boca_fechada',
|
||||
imagePath: 'assets/mockup_images/7.png',
|
||||
),
|
||||
QuizAnswer(
|
||||
title: 'Não',
|
||||
description: 'Não tem olheiras semelhantes à imagem',
|
||||
weight: 1,
|
||||
value: 'nao',
|
||||
title: 'Boca entreaberta',
|
||||
description: 'Boca entreaberta habitualmente',
|
||||
weight: 2,
|
||||
hideTitle: true,
|
||||
value: 'boca_entreaberta',
|
||||
imagePath: 'assets/mockup_images/4.jpeg',
|
||||
),
|
||||
],
|
||||
currentScore: currentScore,
|
||||
nextRoute: (context, nextScore) => MaterialPageRoute<void>(
|
||||
builder: (_) => Quiz21Screen(currentScore: nextScore, scopeId: scopeId),
|
||||
builder: (_) => QuizVideoGuideScreen(
|
||||
youtubeId: 'msKYr7nPxcw',
|
||||
extraHeading: 'Observe atentamente a face do seu filho...',
|
||||
extraSubtitle:
|
||||
'Vamos precisar da sua ajuda para registrar o que vê no seu filho/a!',
|
||||
onAdvance: (ctx) => Navigator.of(ctx).pushReplacement(
|
||||
MaterialPageRoute<void>(
|
||||
builder: (_) =>
|
||||
Quiz21Screen(currentScore: nextScore, scopeId: scopeId),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
answerType: QuizAnswerType.yesNo,
|
||||
answerType: QuizAnswerType.image,
|
||||
showBackButton: true,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Quiz 21: Queixo (Image-based)
|
||||
// Quiz 21: Zona abaixo dos olhos (Image-choice)
|
||||
class Quiz21Screen extends StatelessWidget {
|
||||
const Quiz21Screen({super.key, required this.currentScore, this.scopeId});
|
||||
|
||||
@@ -911,39 +996,50 @@ class Quiz21Screen extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return QuizQuestionScreen(
|
||||
title: 'Quiz 21/23',
|
||||
title: 'Quiz 21/26',
|
||||
category: 'Avaliação facial',
|
||||
categoryIcon: Icons.face_rounded,
|
||||
categoryIcon: Icons.visibility_rounded,
|
||||
fallbackIcon: Icons.visibility_rounded,
|
||||
fallbackColor: const Color(0xFFFF55A7),
|
||||
question:
|
||||
'Com a boca fechada, o queixo do seu filho/a se parece com o desta imagem?',
|
||||
questionImagePaths: const ['assets/mockup_images/6.jpeg'],
|
||||
suggestedYoutubeId: '', // TODO: colar o ID do YouTube do Episódio 4
|
||||
suggestedVideoTitle: 'Ver vídeo: Episódio 4',
|
||||
answers: const [
|
||||
'Qual das imagens, na zona abaixo dos olhos, se assemelha mais ao seu filho/a?',
|
||||
answers: [
|
||||
QuizAnswer(
|
||||
title: 'Sim',
|
||||
description: 'O queixo se assemelha à imagem',
|
||||
weight: 2,
|
||||
value: 'sim',
|
||||
title: 'Sem sinais',
|
||||
description: 'Sem olheiras visíveis abaixo dos olhos',
|
||||
weight: 1,
|
||||
hideTitle: true,
|
||||
value: 'sem_olheiras',
|
||||
imageBuilder: (context) => _zoomCrop(
|
||||
'assets/mockup_images/9.png',
|
||||
alignment: const Alignment(0, -0.55),
|
||||
scale: 2.3,
|
||||
),
|
||||
),
|
||||
QuizAnswer(
|
||||
title: 'Não',
|
||||
description: 'O queixo não se assemelha à imagem',
|
||||
weight: 1,
|
||||
value: 'nao',
|
||||
title: 'Sinal de risco',
|
||||
description: 'Olheiras visíveis abaixo dos olhos',
|
||||
weight: 2,
|
||||
hideTitle: true,
|
||||
value: 'com_olheiras',
|
||||
imageBuilder: (context) => _zoomCrop(
|
||||
'assets/mockup_images/8.jpeg',
|
||||
alignment: const Alignment(0, -0.55),
|
||||
scale: 2.3,
|
||||
),
|
||||
),
|
||||
],
|
||||
currentScore: currentScore,
|
||||
nextRoute: (context, nextScore) => MaterialPageRoute<void>(
|
||||
builder: (_) => Quiz22Screen(currentScore: nextScore, scopeId: scopeId),
|
||||
),
|
||||
answerType: QuizAnswerType.yesNo,
|
||||
answerType: QuizAnswerType.image,
|
||||
showBackButton: true,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Quiz 22: Boca (Image-based)
|
||||
// Quiz 22: Queixo com a boca fechada (Image-choice)
|
||||
class Quiz22Screen extends StatelessWidget {
|
||||
const Quiz22Screen({super.key, required this.currentScore, this.scopeId});
|
||||
|
||||
@@ -953,38 +1049,42 @@ class Quiz22Screen extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return QuizQuestionScreen(
|
||||
title: 'Quiz 22/23',
|
||||
title: 'Quiz 22/26',
|
||||
category: 'Avaliação facial',
|
||||
categoryIcon: Icons.sentiment_neutral_rounded,
|
||||
question: 'A boca do seu filho/a se parece com a desta imagem?',
|
||||
questionImagePaths: const ['assets/mockup_images/14.jpeg'],
|
||||
suggestedYoutubeId: '', // TODO: colar o ID do YouTube do Episódio 5
|
||||
suggestedVideoTitle: 'Ver vídeo: Episódio 5',
|
||||
categoryIcon: Icons.face_rounded,
|
||||
fallbackIcon: Icons.face_rounded,
|
||||
fallbackColor: const Color(0xFF8E7CC3),
|
||||
question:
|
||||
'Qual das imagens é mais parecida com o queixo do seu filho/a com a boca fechada?',
|
||||
answers: const [
|
||||
QuizAnswer(
|
||||
title: 'Sim',
|
||||
description: 'A boca se assemelha à imagem',
|
||||
weight: 2,
|
||||
value: 'sim',
|
||||
title: 'Queixo relaxado',
|
||||
description: 'Queixo liso e relaxado com a boca fechada',
|
||||
weight: 1,
|
||||
hideTitle: true,
|
||||
value: 'queixo_correto',
|
||||
imagePath: 'assets/mockup_images/5.png',
|
||||
),
|
||||
QuizAnswer(
|
||||
title: 'Não',
|
||||
description: 'A boca não se assemelha à imagem',
|
||||
weight: 1,
|
||||
value: 'nao',
|
||||
title: 'Queixo tenso',
|
||||
description: 'Queixo tenso/franzido com a boca fechada',
|
||||
weight: 2,
|
||||
hideTitle: true,
|
||||
value: 'queixo_tenso',
|
||||
imagePath: 'assets/mockup_images/6.jpeg',
|
||||
),
|
||||
],
|
||||
currentScore: currentScore,
|
||||
nextRoute: (context, nextScore) => MaterialPageRoute<void>(
|
||||
builder: (_) => Quiz23Screen(currentScore: nextScore, scopeId: scopeId),
|
||||
),
|
||||
answerType: QuizAnswerType.yesNo,
|
||||
answerType: QuizAnswerType.image,
|
||||
showBackButton: true,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Quiz 23: Freio (Image-based)
|
||||
// Quiz 23: Boca / dentição (Image-choice)
|
||||
class Quiz23Screen extends StatelessWidget {
|
||||
const Quiz23Screen({super.key, required this.currentScore, this.scopeId});
|
||||
|
||||
@@ -994,37 +1094,182 @@ class Quiz23Screen extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return QuizQuestionScreen(
|
||||
title: 'Quiz 23/23',
|
||||
title: 'Quiz 23/26',
|
||||
category: 'Avaliação facial',
|
||||
categoryIcon: Icons.record_voice_over_rounded,
|
||||
question:
|
||||
'O frénulo (freio) da língua do seu filho/a se parece com o desta imagem?',
|
||||
questionImagePaths: const ['assets/mockup_images/17.png'],
|
||||
suggestedYoutubeId: '', // TODO: colar o ID do YouTube do Episódio 6
|
||||
suggestedVideoTitle: 'Ver vídeo: Episódio 6',
|
||||
categoryIcon: Icons.sentiment_neutral_rounded,
|
||||
fallbackIcon: Icons.sentiment_neutral_rounded,
|
||||
fallbackColor: const Color(0xFF2F9E94),
|
||||
question: 'Qual das seguintes imagens se assemelha à boca do seu filho/a?',
|
||||
answers: const [
|
||||
QuizAnswer(
|
||||
title: 'Sim',
|
||||
description: 'O frénulo se assemelha à imagem',
|
||||
weight: 2,
|
||||
value: 'sim',
|
||||
title: 'Dentição alinhada',
|
||||
description: 'Dentição bem alinhada, sem apinhamento',
|
||||
weight: 1,
|
||||
hideTitle: true,
|
||||
value: 'dentes_alinhados',
|
||||
imagePath: 'assets/mockup_images/24.png',
|
||||
),
|
||||
QuizAnswer(
|
||||
title: 'Não',
|
||||
description: 'O frénulo não se assemelha à imagem',
|
||||
title: 'Dentição desalinhada',
|
||||
description: 'Dentição desalinhada/apinhada',
|
||||
weight: 2,
|
||||
hideTitle: true,
|
||||
value: 'dentes_desalinhados',
|
||||
imagePath: 'assets/mockup_images/23.jpeg',
|
||||
),
|
||||
QuizAnswer(
|
||||
title: 'Dentição sobreposta',
|
||||
description: 'Dentes sobrepostos/tortos',
|
||||
weight: 2,
|
||||
hideTitle: true,
|
||||
value: 'dentes_sobrepostos',
|
||||
imagePath: 'assets/mockup_images/14.jpeg',
|
||||
),
|
||||
],
|
||||
currentScore: currentScore,
|
||||
nextRoute: (context, nextScore) => MaterialPageRoute<void>(
|
||||
builder: (_) => Quiz24Screen(currentScore: nextScore, scopeId: scopeId),
|
||||
),
|
||||
answerType: QuizAnswerType.image,
|
||||
showBackButton: true,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Quiz 24: Freio labial (Image-choice)
|
||||
class Quiz24Screen extends StatelessWidget {
|
||||
const Quiz24Screen({super.key, required this.currentScore, this.scopeId});
|
||||
|
||||
final int currentScore;
|
||||
final String? scopeId;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return QuizQuestionScreen(
|
||||
title: 'Quiz 24/26',
|
||||
category: 'Avaliação facial',
|
||||
categoryIcon: Icons.record_voice_over_rounded,
|
||||
fallbackIcon: Icons.record_voice_over_rounded,
|
||||
fallbackColor: const Color(0xFFFF55A7),
|
||||
question:
|
||||
'Qual das seguintes imagens se assemelha ao freio labial do seu filho/a?',
|
||||
answers: const [
|
||||
QuizAnswer(
|
||||
title: 'Freio labial correto',
|
||||
description: 'Inserção do freio labial mais alta',
|
||||
weight: 1,
|
||||
value: 'nao',
|
||||
hideTitle: true,
|
||||
value: 'freio_labial_correto',
|
||||
imagePath: 'assets/mockup_images/20.png',
|
||||
),
|
||||
QuizAnswer(
|
||||
title: 'Freio labial inadequado',
|
||||
description: 'Inserção do freio labial baixa, entre os dentes',
|
||||
weight: 2,
|
||||
hideTitle: true,
|
||||
value: 'freio_labial_inadequado',
|
||||
imagePath: 'assets/mockup_images/19.jpeg',
|
||||
),
|
||||
],
|
||||
currentScore: currentScore,
|
||||
nextRoute: (context, nextScore) => MaterialPageRoute<void>(
|
||||
builder: (_) => Quiz25Screen(currentScore: nextScore, scopeId: scopeId),
|
||||
),
|
||||
answerType: QuizAnswerType.image,
|
||||
showBackButton: true,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Quiz 25: Freio lingual (Image-choice)
|
||||
class Quiz25Screen extends StatelessWidget {
|
||||
const Quiz25Screen({super.key, required this.currentScore, this.scopeId});
|
||||
|
||||
final int currentScore;
|
||||
final String? scopeId;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return QuizQuestionScreen(
|
||||
title: 'Quiz 25/26',
|
||||
category: 'Avaliação facial',
|
||||
categoryIcon: Icons.record_voice_over_rounded,
|
||||
fallbackIcon: Icons.record_voice_over_rounded,
|
||||
fallbackColor: const Color(0xFF8E7CC3),
|
||||
question:
|
||||
'Qual das seguintes imagens se assemelha ao freio lingual do seu filho/a?',
|
||||
answers: const [
|
||||
QuizAnswer(
|
||||
title: 'Freio lingual correto',
|
||||
description: 'Língua move-se livremente, sem restrição visível',
|
||||
weight: 1,
|
||||
hideTitle: true,
|
||||
value: 'freio_lingual_correto',
|
||||
imagePath: 'assets/mockup_images/17.png',
|
||||
),
|
||||
QuizAnswer(
|
||||
title: 'Freio lingual inadequado',
|
||||
description: 'Freio lingual curto/apertado (língua em coração)',
|
||||
weight: 2,
|
||||
hideTitle: true,
|
||||
value: 'freio_lingual_inadequado',
|
||||
imagePath: 'assets/mockup_images/18.jpeg',
|
||||
),
|
||||
],
|
||||
currentScore: currentScore,
|
||||
nextRoute: (context, nextScore) => MaterialPageRoute<void>(
|
||||
builder: (_) => Quiz26Screen(currentScore: nextScore, scopeId: scopeId),
|
||||
),
|
||||
answerType: QuizAnswerType.image,
|
||||
showBackButton: true,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Quiz 26: Céu da boca (Image-choice, final)
|
||||
class Quiz26Screen extends StatelessWidget {
|
||||
const Quiz26Screen({super.key, required this.currentScore, this.scopeId});
|
||||
|
||||
final int currentScore;
|
||||
final String? scopeId;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return QuizQuestionScreen(
|
||||
title: 'Quiz 26/26',
|
||||
category: 'Avaliação facial',
|
||||
categoryIcon: Icons.architecture_rounded,
|
||||
fallbackIcon: Icons.architecture_rounded,
|
||||
fallbackColor: const Color(0xFFFF55A7),
|
||||
question:
|
||||
'Qual das seguintes imagens se assemelha ao céu da boca do seu filho/a?',
|
||||
answers: const [
|
||||
QuizAnswer(
|
||||
title: 'Posição em U saudável',
|
||||
description: 'Palato largo, em forma de U',
|
||||
weight: 1,
|
||||
hideTitle: true,
|
||||
value: 'palato_u',
|
||||
imagePath: 'assets/mockup_images/26.png',
|
||||
),
|
||||
QuizAnswer(
|
||||
title: 'Posição profunda incorreta',
|
||||
description: 'Palato estreito/profundo, em forma de V',
|
||||
weight: 2,
|
||||
hideTitle: true,
|
||||
value: 'palato_v',
|
||||
imagePath: 'assets/mockup_images/27.png',
|
||||
),
|
||||
],
|
||||
currentScore: currentScore,
|
||||
nextRoute: (context, nextScore) => MaterialPageRoute<void>(
|
||||
builder: (_) => QuizResultScreen(
|
||||
finalScore: nextScore,
|
||||
maxScore: 46,
|
||||
maxScore: 52,
|
||||
scopeId: scopeId,
|
||||
),
|
||||
),
|
||||
answerType: QuizAnswerType.yesNo,
|
||||
answerType: QuizAnswerType.image,
|
||||
isFinal: true,
|
||||
showBackButton: true,
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user