CKT String|Colors

This commit is contained in:
Carlos Correia
2026-07-15 19:13:15 +01:00
parent 3214a07779
commit a8af2c6845
35 changed files with 1390 additions and 688 deletions

View File

@@ -1,4 +1,7 @@
import 'package:flutter/material.dart';
import '../colors/app_colors.dart';
import '../strings/quiz_strings.dart';
import '../strings/quiz_ui_strings.dart';
import 'quiz_checklist_screen.dart';
import 'quiz_question_screen.dart';
@@ -56,11 +59,11 @@ Route<void> quizPageRoute({required WidgetBuilder builder}) {
Route<void> quizStartRoute({String? scopeId}) {
return quizPageRoute(
builder: (_) => QuizChecklistScreen(
heading: 'Vamos ajudá-lo/a a compreender:',
heading: QuizStrings.checklistHeading,
items: const [
'Sinais de alerta podem passar despercebidos',
'Prevenir é melhor do que tratar',
'Quando deve procurar um dentista (urgência vs vigilância)',
QuizStrings.checklistItem1,
QuizStrings.checklistItem2,
QuizStrings.checklistItem3,
],
onAdvance: (context) => Navigator.of(context).pushReplacement(
quizPageRoute(builder: (_) => Quiz1Screen(scopeId: scopeId)),
@@ -83,25 +86,25 @@ class Quiz1Screen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return QuizQuestionScreen(
title: 'Quiz 1/29',
fallbackColor: const Color(0xFFFF55A7),
question: 'O seu filho/a tem problemas respiratórios diagnosticados?',
title: QuizUiStrings.quizProgress(1, 29),
fallbackColor: AppColors.pink,
question: QuizStrings.q1Question,
answers: const [
QuizAnswer(
title: 'Sim',
description: 'Problemas respiratórios diagnosticados',
title: QuizStrings.yes,
description: QuizStrings.q1YesDescription,
weight: 2,
value: 'sim',
),
QuizAnswer(
title: 'Não',
description: 'Sem problemas respiratórios diagnosticados',
title: QuizStrings.no,
description: QuizStrings.q1NoDescription,
weight: 1,
value: 'nao',
),
QuizAnswer(
title: 'Não sei',
description: 'Não tenho a certeza',
title: QuizStrings.dontKnow,
description: QuizStrings.dontKnowDescription,
weight: 1,
value: 'nao_sei',
helpVideoId: 6,
@@ -127,25 +130,25 @@ class Quiz2Screen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return QuizQuestionScreen(
title: 'Quiz 2/29',
fallbackColor: const Color(0xFF2F9E94),
question: 'O seu filho/a respira habitualmente pela boca?',
title: QuizUiStrings.quizProgress(2, 29),
fallbackColor: AppColors.teal,
question: QuizStrings.q2Question,
answers: const [
QuizAnswer(
title: 'Sim',
description: 'Respira habitualmente pela boca',
title: QuizStrings.yes,
description: QuizStrings.q2YesDescription,
weight: 2,
value: 'sim',
),
QuizAnswer(
title: 'Não',
description: 'Não respira habitualmente pela boca',
title: QuizStrings.no,
description: QuizStrings.q2NoDescription,
weight: 1,
value: 'nao',
),
QuizAnswer(
title: 'Não sei',
description: 'Não tenho a certeza',
title: QuizStrings.dontKnow,
description: QuizStrings.dontKnowDescription,
weight: 1,
value: 'nao_sei',
helpVideoId: 10,
@@ -171,25 +174,25 @@ class Quiz3Screen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return QuizQuestionScreen(
title: 'Quiz 3/29',
fallbackColor: const Color(0xFFFF55A7),
question: 'O seu filho/a ressona habitualmente durante a noite?',
title: QuizUiStrings.quizProgress(3, 29),
fallbackColor: AppColors.pink,
question: QuizStrings.q3Question,
answers: const [
QuizAnswer(
title: 'Sim',
description: 'Ressonar habitualmente durante a noite',
title: QuizStrings.yes,
description: QuizStrings.q3YesDescription,
weight: 2,
value: 'sim',
),
QuizAnswer(
title: 'Não',
description: 'Não ressona habitualmente',
title: QuizStrings.no,
description: QuizStrings.q3NoDescription,
weight: 1,
value: 'nao',
),
QuizAnswer(
title: 'Não sei',
description: 'Não tenho a certeza',
title: QuizStrings.dontKnow,
description: QuizStrings.dontKnowDescription,
weight: 1,
value: 'nao_sei',
helpVideoId: 8,
@@ -215,25 +218,25 @@ class Quiz4Screen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return QuizQuestionScreen(
title: 'Quiz 4/29',
fallbackColor: const Color(0xFFFF55A7),
question: 'O seu filho/a sente habitualmente o nariz "tapado"?',
title: QuizUiStrings.quizProgress(4, 29),
fallbackColor: AppColors.pink,
question: QuizStrings.q4Question,
answers: const [
QuizAnswer(
title: 'Sim',
description: 'Sente habitualmente o nariz tapado',
title: QuizStrings.yes,
description: QuizStrings.q4YesDescription,
weight: 2,
value: 'sim',
),
QuizAnswer(
title: 'Não',
description: 'Não sente habitualmente o nariz tapado',
title: QuizStrings.no,
description: QuizStrings.q4NoDescription,
weight: 1,
value: 'nao',
),
QuizAnswer(
title: 'Não sei',
description: 'Não tenho a certeza',
title: QuizStrings.dontKnow,
description: QuizStrings.dontKnowDescription,
weight: 1,
value: 'nao_sei',
helpVideoId: 1,
@@ -259,27 +262,25 @@ class Quiz5Screen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return QuizQuestionScreen(
title: 'Quiz 5/29',
fallbackColor: const Color(0xFFFF55A7),
question:
'Durante o sono, o seu filho/a tem habitualmente interrupções da respiração?',
title: QuizUiStrings.quizProgress(5, 29),
fallbackColor: AppColors.pink,
question: QuizStrings.q5Question,
answers: const [
QuizAnswer(
title: 'Sim',
description:
'Tem habitualmente interrupções da respiração durante o sono',
title: QuizStrings.yes,
description: QuizStrings.q5YesDescription,
weight: 2,
value: 'sim',
),
QuizAnswer(
title: 'Não',
description: 'Não tem interrupções da respiração durante o sono',
title: QuizStrings.no,
description: QuizStrings.q5NoDescription,
weight: 1,
value: 'nao',
),
QuizAnswer(
title: 'Não sei',
description: 'Não tenho a certeza',
title: QuizStrings.dontKnow,
description: QuizStrings.dontKnowDescription,
weight: 1,
value: 'nao_sei',
helpVideoId: 7,
@@ -305,19 +306,19 @@ class Quiz6Screen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return QuizQuestionScreen(
title: 'Quiz 6/29',
fallbackColor: const Color(0xFF2F9E94),
question: 'O seu filho/a range os dentes com frequência?',
title: QuizUiStrings.quizProgress(6, 29),
fallbackColor: AppColors.teal,
question: QuizStrings.q6Question,
answers: const [
QuizAnswer(
title: 'Sim',
description: 'Range os dentes com frequência',
title: QuizStrings.yes,
description: QuizStrings.q6YesDescription,
weight: 2,
value: 'sim',
),
QuizAnswer(
title: 'Não',
description: 'Não range os dentes com frequência',
title: QuizStrings.no,
description: QuizStrings.q6NoDescription,
weight: 1,
value: 'nao',
),
@@ -342,25 +343,25 @@ class Quiz7Screen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return QuizQuestionScreen(
title: 'Quiz 7/29',
fallbackColor: const Color(0xFFFF55A7),
question: 'O seu filho/a habitualmente tem alergias sazonais?',
title: QuizUiStrings.quizProgress(7, 29),
fallbackColor: AppColors.pink,
question: QuizStrings.q7Question,
answers: const [
QuizAnswer(
title: 'Sim',
description: 'Habitualmente tem alergias sazonais',
title: QuizStrings.yes,
description: QuizStrings.q7YesDescription,
weight: 2,
value: 'sim',
),
QuizAnswer(
title: 'Não',
description: 'Não tem alergias sazonais',
title: QuizStrings.no,
description: QuizStrings.q7NoDescription,
weight: 1,
value: 'nao',
),
QuizAnswer(
title: 'Não sei',
description: 'Não tenho a certeza',
title: QuizStrings.dontKnow,
description: QuizStrings.dontKnowDescription,
weight: 1,
value: 'nao_sei',
helpVideoId: 2,
@@ -386,25 +387,25 @@ class Quiz8Screen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return QuizQuestionScreen(
title: 'Quiz 8/29',
fallbackColor: const Color(0xFFFF55A7),
question: 'O seu filho/a acorda com saliva seca na cara ou na almofada?',
title: QuizUiStrings.quizProgress(8, 29),
fallbackColor: AppColors.pink,
question: QuizStrings.q8Question,
answers: const [
QuizAnswer(
title: 'Sim',
description: 'Acorda com saliva seca na cara ou na almofada',
title: QuizStrings.yes,
description: QuizStrings.q8YesDescription,
weight: 2,
value: 'sim',
),
QuizAnswer(
title: 'Não',
description: 'Não acorda com saliva seca',
title: QuizStrings.no,
description: QuizStrings.q8NoDescription,
weight: 1,
value: 'nao',
),
QuizAnswer(
title: 'Não sei',
description: 'Não tenho a certeza',
title: QuizStrings.dontKnow,
description: QuizStrings.dontKnowDescription,
weight: 1,
value: 'nao_sei',
helpVideoId: 9,
@@ -430,25 +431,25 @@ class Quiz9Screen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return QuizQuestionScreen(
title: 'Quiz 9/29',
fallbackColor: const Color(0xFF2F9E94),
question: 'O seu filho/a teve ou costuma ter com frequência otites?',
title: QuizUiStrings.quizProgress(9, 29),
fallbackColor: AppColors.teal,
question: QuizStrings.q9Question,
answers: const [
QuizAnswer(
title: 'Sim',
description: 'Teve ou costuma ter com frequência otites',
title: QuizStrings.yes,
description: QuizStrings.q9YesDescription,
weight: 2,
value: 'sim',
),
QuizAnswer(
title: 'Não',
description: 'Não teve ou não costuma ter otites',
title: QuizStrings.no,
description: QuizStrings.q9NoDescription,
weight: 1,
value: 'nao',
),
QuizAnswer(
title: 'Não sei',
description: 'Não tenho a certeza',
title: QuizStrings.dontKnow,
description: QuizStrings.dontKnowDescription,
weight: 1,
value: 'nao_sei',
helpVideoId: 3,
@@ -474,25 +475,25 @@ class Quiz10Screen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return QuizQuestionScreen(
title: 'Quiz 10/29',
fallbackColor: const Color(0xFFFF55A7),
question: 'O seu filho/a teve ou costuma ter com frequência amigdalites?',
title: QuizUiStrings.quizProgress(10, 29),
fallbackColor: AppColors.pink,
question: QuizStrings.q10Question,
answers: const [
QuizAnswer(
title: 'Sim',
description: 'Teve ou costuma ter com frequência amigdalites',
title: QuizStrings.yes,
description: QuizStrings.q10YesDescription,
weight: 2,
value: 'sim',
),
QuizAnswer(
title: 'Não',
description: 'Não teve ou não costuma ter amigdalites',
title: QuizStrings.no,
description: QuizStrings.q10NoDescription,
weight: 1,
value: 'nao',
),
QuizAnswer(
title: 'Não sei',
description: 'Não tenho a certeza',
title: QuizStrings.dontKnow,
description: QuizStrings.dontKnowDescription,
weight: 1,
value: 'nao_sei',
helpVideoId: 4,
@@ -518,26 +519,25 @@ class Quiz11Screen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return QuizQuestionScreen(
title: 'Quiz 11/29',
fallbackColor: const Color(0xFF2F9E94),
question:
'O seu filho/a teve ou costuma ter com frequência bronquiolites?',
title: QuizUiStrings.quizProgress(11, 29),
fallbackColor: AppColors.teal,
question: QuizStrings.q11Question,
answers: const [
QuizAnswer(
title: 'Sim',
description: 'Teve ou costuma ter com frequência bronquiolites',
title: QuizStrings.yes,
description: QuizStrings.q11YesDescription,
weight: 2,
value: 'sim',
),
QuizAnswer(
title: 'Não',
description: 'Não teve ou não costuma ter bronquiolites',
title: QuizStrings.no,
description: QuizStrings.q11NoDescription,
weight: 1,
value: 'nao',
),
QuizAnswer(
title: 'Não sei',
description: 'Não tenho a certeza',
title: QuizStrings.dontKnow,
description: QuizStrings.dontKnowDescription,
weight: 1,
value: 'nao_sei',
helpVideoId: 5,
@@ -563,19 +563,19 @@ class Quiz12Screen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return QuizQuestionScreen(
title: 'Quiz 12/29',
fallbackColor: const Color(0xFFFF55A7),
question: 'O seu filho/a apresenta dificuldades a mastigar?',
title: QuizUiStrings.quizProgress(12, 29),
fallbackColor: AppColors.pink,
question: QuizStrings.q12Question,
answers: const [
QuizAnswer(
title: 'Sim',
description: 'Apresenta dificuldades a mastigar',
title: QuizStrings.yes,
description: QuizStrings.q12YesDescription,
weight: 2,
value: 'sim',
),
QuizAnswer(
title: 'Não',
description: 'Não apresenta dificuldades a mastigar',
title: QuizStrings.no,
description: QuizStrings.q12NoDescription,
weight: 1,
value: 'nao',
),
@@ -600,19 +600,19 @@ class Quiz13Screen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return QuizQuestionScreen(
title: 'Quiz 13/29',
fallbackColor: const Color(0xFF2F9E94),
question: 'O seu filho/a habitualmente é lento a comer?',
title: QuizUiStrings.quizProgress(13, 29),
fallbackColor: AppColors.teal,
question: QuizStrings.q13Question,
answers: const [
QuizAnswer(
title: 'Sim',
description: 'Habitualmente é lento a comer',
title: QuizStrings.yes,
description: QuizStrings.q13YesDescription,
weight: 2,
value: 'sim',
),
QuizAnswer(
title: 'Não',
description: 'Não é lento a comer',
title: QuizStrings.no,
description: QuizStrings.q13NoDescription,
weight: 1,
value: 'nao',
),
@@ -637,19 +637,19 @@ class Quiz14Screen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return QuizQuestionScreen(
title: 'Quiz 14/29',
fallbackColor: const Color(0xFFFF55A7),
question: 'O seu filho/a habitualmente prefere comer alimentos moles?',
title: QuizUiStrings.quizProgress(14, 29),
fallbackColor: AppColors.pink,
question: QuizStrings.q14Question,
answers: const [
QuizAnswer(
title: 'Sim',
description: 'Habitualmente prefere comer alimentos moles',
title: QuizStrings.yes,
description: QuizStrings.q14YesDescription,
weight: 2,
value: 'sim',
),
QuizAnswer(
title: 'Não',
description: 'Não prefere alimentos moles',
title: QuizStrings.no,
description: QuizStrings.q14NoDescription,
weight: 1,
value: 'nao',
),
@@ -674,25 +674,25 @@ class Quiz15Screen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return QuizQuestionScreen(
title: 'Quiz 15/29',
fallbackColor: const Color(0xFFFF55A7),
question: 'Em bebé apenas foi alimentado por biberão?',
title: QuizUiStrings.quizProgress(15, 29),
fallbackColor: AppColors.pink,
question: QuizStrings.q15Question,
answers: const [
QuizAnswer(
title: 'Sim',
description: 'Em bebé apenas foi alimentado por biberão',
title: QuizStrings.yes,
description: QuizStrings.q15YesDescription,
weight: 2,
value: 'sim',
),
QuizAnswer(
title: 'Não',
description: 'Não foi apenas alimentado por biberão',
title: QuizStrings.no,
description: QuizStrings.q15NoDescription,
weight: 1,
value: 'nao',
),
QuizAnswer(
title: 'Não sei',
description: 'Não tenho a certeza',
title: QuizStrings.dontKnow,
description: QuizStrings.dontKnowDescription,
weight: 1,
value: 'nao_sei',
helpVideoId: 11,
@@ -718,25 +718,25 @@ class Quiz16Screen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return QuizQuestionScreen(
title: 'Quiz 16/29',
fallbackColor: const Color(0xFF2F9E94),
question: 'O seu filho/a usa ou usou chupeta com frequência?',
title: QuizUiStrings.quizProgress(16, 29),
fallbackColor: AppColors.teal,
question: QuizStrings.q16Question,
answers: const [
QuizAnswer(
title: 'Sim',
description: 'Usa ou usou chupeta com frequência',
title: QuizStrings.yes,
description: QuizStrings.q16YesDescription,
weight: 2,
value: 'sim',
),
QuizAnswer(
title: 'Não',
description: 'Não usa ou não usou chupeta com frequência',
title: QuizStrings.no,
description: QuizStrings.q16NoDescription,
weight: 1,
value: 'nao',
),
QuizAnswer(
title: 'Não sei',
description: 'Não tenho a certeza',
title: QuizStrings.dontKnow,
description: QuizStrings.dontKnowDescription,
weight: 1,
value: 'nao_sei',
helpVideoId: 12,
@@ -762,25 +762,25 @@ class Quiz17Screen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return QuizQuestionScreen(
title: 'Quiz 17/29',
fallbackColor: const Color(0xFFFF55A7),
question: 'O seu filho/a chucha ou já chuchou o dedo com frequência?',
title: QuizUiStrings.quizProgress(17, 29),
fallbackColor: AppColors.pink,
question: QuizStrings.q17Question,
answers: const [
QuizAnswer(
title: 'Sim',
description: 'Chucha ou já chuchou o dedo com frequência',
title: QuizStrings.yes,
description: QuizStrings.q17YesDescription,
weight: 2,
value: 'sim',
),
QuizAnswer(
title: 'Não',
description: 'Não chucha ou não chuchou o dedo com frequência',
title: QuizStrings.no,
description: QuizStrings.q17NoDescription,
weight: 1,
value: 'nao',
),
QuizAnswer(
title: 'Não sei',
description: 'Não tenho a certeza',
title: QuizStrings.dontKnow,
description: QuizStrings.dontKnowDescription,
weight: 1,
value: 'nao_sei',
helpVideoId: 13,
@@ -814,23 +814,22 @@ class Quiz18Screen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return QuizQuestionScreen(
title: 'Quiz 18/29',
fallbackColor: const Color(0xFFFF55A7),
title: QuizUiStrings.quizProgress(18, 29),
fallbackColor: AppColors.pink,
answerImageAspectRatio: 1.5,
question:
'Qual das seguintes imagens é mais parecida com a postura do seu filho/a?',
question: QuizStrings.q18Question,
answers: const [
QuizAnswer(
title: 'Postura inadequada',
description: 'Postura curvada, ombros e pescoço projetados',
title: QuizStrings.q18Answer1Title,
description: QuizStrings.q18Answer1Description,
weight: 2,
hideTitle: true,
value: 'postura_inadequada',
imagePath: 'assets/mockup_images/0.1.png',
),
QuizAnswer(
title: 'Postura correta',
description: 'Postura ereta, coluna alinhada',
title: QuizStrings.q18Answer2Title,
description: QuizStrings.q18Answer2Description,
weight: 1,
hideTitle: true,
value: 'postura_correta',
@@ -857,14 +856,13 @@ class Quiz19Screen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return QuizQuestionScreen(
title: 'Quiz 19/29',
fallbackColor: const Color(0xFFFF55A7),
question:
'Qual das seguintes imagens é mais parecida com o perfil do seu filho/a?',
title: QuizUiStrings.quizProgress(19, 29),
fallbackColor: AppColors.pink,
question: QuizStrings.q19Question,
answers: [
QuizAnswer(
title: 'Perfil convexo',
description: 'Perfil facial convexo',
title: QuizStrings.q19Answer1Title,
description: QuizStrings.q19Answer1Description,
weight: 2,
hideTitle: true,
value: 'perfil_convexo',
@@ -875,8 +873,8 @@ class Quiz19Screen extends StatelessWidget {
),
),
QuizAnswer(
title: 'Perfil reto',
description: 'Perfil facial reto',
title: QuizStrings.q19Answer2Title,
description: QuizStrings.q19Answer2Description,
weight: 1,
hideTitle: true,
value: 'perfil_reto',
@@ -887,8 +885,8 @@ class Quiz19Screen extends StatelessWidget {
),
),
QuizAnswer(
title: 'Perfil côncavo',
description: 'Perfil facial côncavo',
title: QuizStrings.q19Answer3Title,
description: QuizStrings.q19Answer3Description,
weight: 2,
hideTitle: true,
value: 'perfil_concavo',
@@ -919,21 +917,21 @@ class Quiz20Screen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return QuizQuestionScreen(
title: 'Quiz 20/29',
fallbackColor: const Color(0xFF2F9E94),
question: 'Qual é a posição da boca do seu filho/a habitualmente?',
title: QuizUiStrings.quizProgress(20, 29),
fallbackColor: AppColors.teal,
question: QuizStrings.q20Question,
answers: [
const QuizAnswer(
title: 'Boca fechada',
description: 'Boca fechada habitualmente',
title: QuizStrings.q20Answer1Title,
description: QuizStrings.q20Answer1Description,
weight: 1,
hideTitle: true,
value: 'boca_fechada',
imagePath: 'assets/mockup_images/7.png',
),
QuizAnswer(
title: 'Boca entreaberta',
description: 'Boca entreaberta habitualmente',
title: QuizStrings.q20Answer2Title,
description: QuizStrings.q20Answer2Description,
weight: 2,
hideTitle: true,
value: 'boca_entreaberta',
@@ -964,14 +962,13 @@ class Quiz21Screen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return QuizQuestionScreen(
title: 'Quiz 21/29',
fallbackColor: const Color(0xFFFF55A7),
question:
'Qual das imagens, na zona abaixo dos olhos, se assemelha mais ao seu filho/a?',
title: QuizUiStrings.quizProgress(21, 29),
fallbackColor: AppColors.pink,
question: QuizStrings.q21Question,
answers: [
QuizAnswer(
title: 'Sem sinais',
description: 'Sem olheiras visíveis abaixo dos olhos',
title: QuizStrings.q21Answer1Title,
description: QuizStrings.q21Answer1Description,
weight: 1,
hideTitle: true,
value: 'sem_olheiras',
@@ -982,8 +979,8 @@ class Quiz21Screen extends StatelessWidget {
),
),
QuizAnswer(
title: 'Sinal de risco',
description: 'Olheiras visíveis abaixo dos olhos',
title: QuizStrings.q21Answer2Title,
description: QuizStrings.q21Answer2Description,
weight: 2,
hideTitle: true,
value: 'com_olheiras',
@@ -1014,15 +1011,14 @@ class Quiz22Screen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return QuizQuestionScreen(
title: 'Quiz 22/29',
fallbackColor: const Color(0xFFFF55A7),
title: QuizUiStrings.quizProgress(22, 29),
fallbackColor: AppColors.pink,
isSignQuestion: true,
question:
'Qual das imagens é mais parecida com o queixo do seu filho/a com a boca fechada?',
question: QuizStrings.q22Question,
answers: [
QuizAnswer(
title: 'Queixo relaxado',
description: 'Queixo liso e relaxado com a boca fechada',
title: QuizStrings.q22Answer1Title,
description: QuizStrings.q22Answer1Description,
weight: 1,
hideTitle: true,
value: 'queixo_correto',
@@ -1034,8 +1030,8 @@ class Quiz22Screen extends StatelessWidget {
),
),
const QuizAnswer(
title: 'Queixo tenso',
description: 'Queixo tenso/franzido com a boca fechada',
title: QuizStrings.q22Answer2Title,
description: QuizStrings.q22Answer2Description,
weight: 2,
hideTitle: true,
value: 'queixo_tenso',
@@ -1070,31 +1066,30 @@ class Quiz23Screen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return QuizQuestionScreen(
title: 'Quiz 23/29',
fallbackColor: const Color(0xFF2F9E94),
title: QuizUiStrings.quizProgress(23, 29),
fallbackColor: AppColors.teal,
isSignQuestion: true,
question:
'Qual das seguintes imagens se assemelha à boca do seu filho/a?',
question: QuizStrings.q23Question,
answers: const [
QuizAnswer(
title: 'Dentição sobreposta',
description: 'Dentes sobrepostos/tortos',
title: QuizStrings.q23Answer1Title,
description: QuizStrings.q23Answer1Description,
weight: 2,
hideTitle: true,
value: 'dentes_sobrepostos',
imagePath: 'assets/mockup_images/10.png',
),
QuizAnswer(
title: 'Dentição alinhada',
description: 'Dentição bem alinhada, sem apinhamento',
title: QuizStrings.q23Answer2Title,
description: QuizStrings.q23Answer2Description,
weight: 1,
hideTitle: true,
value: 'dentes_alinhados',
imagePath: 'assets/mockup_images/11.png',
),
QuizAnswer(
title: 'Dentição desalinhada',
description: 'Dentição desalinhada/apinhada',
title: QuizStrings.q23Answer3Title,
description: QuizStrings.q23Answer3Description,
weight: 2,
hideTitle: true,
value: 'dentes_desalinhados',
@@ -1121,31 +1116,30 @@ class Quiz24Screen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return QuizQuestionScreen(
title: 'Quiz 24/29',
fallbackColor: const Color(0xFF2F9E94),
title: QuizUiStrings.quizProgress(24, 29),
fallbackColor: AppColors.teal,
isSignQuestion: true,
question:
'Qual das seguintes imagens se assemelha à boca do seu filho/a?',
question: QuizStrings.q24Question,
answers: const [
QuizAnswer(
title: 'Apinhamento moderado',
description: 'Dentes rodados/desalinhados de forma mais visível',
title: QuizStrings.q24Answer1Title,
description: QuizStrings.q24Answer1Description,
weight: 2,
hideTitle: true,
value: 'apinhamento_moderado',
imagePath: 'assets/mockup_images/16.png',
),
QuizAnswer(
title: 'Ligeiro desalinhamento',
description: 'Pequeno desalinhamento ou espaço entre alguns dentes',
title: QuizStrings.q24Answer2Title,
description: QuizStrings.q24Answer2Description,
weight: 1,
hideTitle: true,
value: 'apinhamento_leve',
imagePath: 'assets/mockup_images/15.png',
),
QuizAnswer(
title: 'Apinhamento acentuado',
description: 'Dentes muito sobrepostos entre si',
title: QuizStrings.q24Answer3Title,
description: QuizStrings.q24Answer3Description,
weight: 2,
hideTitle: true,
value: 'apinhamento_acentuado',
@@ -1172,22 +1166,21 @@ class Quiz25Screen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return QuizQuestionScreen(
title: 'Quiz 25/29',
fallbackColor: const Color(0xFFFF55A7),
question:
'Qual das seguintes imagens se assemelha ao freio labial do seu filho/a?',
title: QuizUiStrings.quizProgress(25, 29),
fallbackColor: AppColors.pink,
question: QuizStrings.q25Question,
answers: const [
QuizAnswer(
title: 'Freio labial correto',
description: 'Inserção do freio labial mais alta',
title: QuizStrings.q25Answer1Title,
description: QuizStrings.q25Answer1Description,
weight: 1,
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',
title: QuizStrings.q25Answer2Title,
description: QuizStrings.q25Answer2Description,
weight: 2,
hideTitle: true,
value: 'freio_labial_inadequado',
@@ -1214,22 +1207,21 @@ class Quiz26Screen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return QuizQuestionScreen(
title: 'Quiz 26/29',
fallbackColor: const Color(0xFFFF55A7),
question:
'Qual das seguintes imagens se assemelha ao freio lingual do seu filho/a?',
title: QuizUiStrings.quizProgress(26, 29),
fallbackColor: AppColors.pink,
question: QuizStrings.q26Question,
answers: const [
QuizAnswer(
title: 'Freio lingual inadequado',
description: 'Freio lingual curto/apertado (língua em coração)',
title: QuizStrings.q26Answer1Title,
description: QuizStrings.q26Answer1Description,
weight: 2,
hideTitle: true,
value: 'freio_lingual_inadequado',
imagePath: 'assets/mockup_images/17.png',
),
QuizAnswer(
title: 'Freio lingual correto',
description: 'Língua move-se livremente, sem restrição visível',
title: QuizStrings.q26Answer2Title,
description: QuizStrings.q26Answer2Description,
weight: 1,
hideTitle: true,
value: 'freio_lingual_correto',
@@ -1256,31 +1248,30 @@ class Quiz27Screen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return QuizQuestionScreen(
title: 'Quiz 27/29',
fallbackColor: const Color(0xFF2F9E94),
title: QuizUiStrings.quizProgress(27, 29),
fallbackColor: AppColors.teal,
isSignQuestion: true,
question:
'Qual das seguintes imagens se assemelha com a boca do seu filho/a?',
question: QuizStrings.q27Question,
answers: const [
QuizAnswer(
title: 'Dentição desalinhada',
description: 'Dentição desalinhada/apinhada',
title: QuizStrings.q27Answer1Title,
description: QuizStrings.q27Answer1Description,
weight: 2,
hideTitle: true,
value: 'dentes_desalinhados_3',
imagePath: 'assets/mockup_images/23.JPEG',
),
QuizAnswer(
title: 'Dentição sobreposta',
description: 'Dentes sobrepostos/tortos',
title: QuizStrings.q27Answer2Title,
description: QuizStrings.q27Answer2Description,
weight: 2,
hideTitle: true,
value: 'dentes_sobrepostos_3',
imagePath: 'assets/mockup_images/24.png',
),
QuizAnswer(
title: 'Dentição alinhada',
description: 'Dentição bem alinhada, sem apinhamento',
title: QuizStrings.q27Answer3Title,
description: QuizStrings.q27Answer3Description,
weight: 1,
hideTitle: true,
value: 'dentes_alinhados_3',
@@ -1307,23 +1298,22 @@ class Quiz28Screen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return QuizQuestionScreen(
title: 'Quiz 28/29',
fallbackColor: const Color(0xFF2F9E94),
title: QuizUiStrings.quizProgress(28, 29),
fallbackColor: AppColors.teal,
isSignQuestion: true,
question:
'Qual das seguintes imagens se assemelha à boca do seu filho/a?',
question: QuizStrings.q28Question,
answers: const [
QuizAnswer(
title: 'Dentição alinhada',
description: 'Dentição bem alinhada, sem apinhamento',
title: QuizStrings.q28Answer1Title,
description: QuizStrings.q28Answer1Description,
weight: 1,
hideTitle: true,
value: 'dentes_alinhados_2',
imagePath: 'assets/mockup_images/29.jpeg',
),
QuizAnswer(
title: 'Dentição desalinhada',
description: 'Dentes sobrepostos/apinhados',
title: QuizStrings.q28Answer2Title,
description: QuizStrings.q28Answer2Description,
weight: 2,
hideTitle: true,
value: 'dentes_desalinhados_2',
@@ -1350,24 +1340,23 @@ class Quiz29Screen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return QuizQuestionScreen(
title: 'Quiz 29/29',
fallbackColor: const Color(0xFFFF55A7),
title: QuizUiStrings.quizProgress(29, 29),
fallbackColor: AppColors.pink,
isSignQuestion: true,
correctBadgeLabel: 'Posição saudável',
question:
'Qual das seguintes imagens se assemelha ao céu da boca do seu filho/a?',
correctBadgeLabel: QuizStrings.q29CorrectBadgeLabel,
question: QuizStrings.q29Question,
answers: const [
QuizAnswer(
title: 'Posição profunda incorreta',
description: 'Palato estreito/profundo, em forma de V',
title: QuizStrings.q29Answer1Title,
description: QuizStrings.q29Answer1Description,
weight: 2,
hideTitle: true,
value: 'palato_v',
imagePath: 'assets/mockup_images/26.png',
),
QuizAnswer(
title: 'Posição em U saudável',
description: 'Palato largo, em forma de U',
title: QuizStrings.q29Answer2Title,
description: QuizStrings.q29Answer2Description,
weight: 1,
hideTitle: true,
value: 'palato_u',

View File

@@ -1,11 +1,13 @@
import 'package:flutter/material.dart';
import '../colors/app_colors.dart';
import '../strings/quiz_ui_strings.dart';
import '../widgets/entrance.dart';
import '../widgets/liquid_waves_background.dart';
import '../widgets/tap_bounce.dart';
const Color _pink = Color(0xFFFF55A7);
const Color _teal = Color(0xFF2F9E94);
const Color _pink = AppColors.pink;
const Color _teal = AppColors.teal;
/// Ecrã intersticial informativo, mostrado a meio do quiz para preparar o
/// utilizador antes de continuar (ex.: logo a seguir a um vídeo-guia) —
@@ -30,7 +32,7 @@ class QuizChecklistScreen extends StatelessWidget {
body: Stack(
clipBehavior: Clip.none,
children: [
Positioned.fill(child: Container(color: const Color(0xFFFAFAF7))),
Positioned.fill(child: Container(color: AppColors.background)),
const LiquidWavesBackground(),
SafeArea(
child: Padding(
@@ -129,7 +131,7 @@ class QuizChecklistScreen extends StatelessWidget {
),
),
onPressed: () => onAdvance(context),
child: const Text('Avançar'),
child: const Text(QuizUiStrings.advance),
),
),
),

View File

@@ -1,7 +1,9 @@
import 'package:flutter/material.dart';
import '../colors/app_colors.dart';
import 'package:flutter/services.dart';
import '../screens/video_screen.dart';
import '../strings/quiz_ui_strings.dart';
import '../widgets/entrance.dart';
import '../widgets/liquid_waves_background.dart';
import '../widgets/tap_bounce.dart';
@@ -82,7 +84,7 @@ class QuizQuestionScreen extends StatefulWidget {
this.suggestedVideoTitle,
this.fallbackColor,
this.answerImageAspectRatio,
this.correctBadgeLabel = 'Posição certa',
this.correctBadgeLabel = QuizUiStrings.defaultCorrectBadgeLabel,
});
final String title;
@@ -197,7 +199,7 @@ class _QuizQuestionScreenState extends State<QuizQuestionScreen> {
body: Stack(
clipBehavior: Clip.none,
children: [
Positioned.fill(child: Container(color: const Color(0xFFFAFAF7))),
Positioned.fill(child: Container(color: AppColors.background)),
const LiquidWavesBackground(),
SafeArea(
child: Column(
@@ -222,7 +224,7 @@ class _QuizQuestionScreenState extends State<QuizQuestionScreen> {
padding: EdgeInsets.all(9),
child: Icon(
Icons.arrow_back_rounded,
color: Color(0xFF2F9E94),
color: AppColors.teal,
size: 20,
),
),
@@ -241,11 +243,11 @@ class _QuizQuestionScreenState extends State<QuizQuestionScreen> {
1.0,
),
minHeight: 8,
backgroundColor: const Color(
0xFFFF55A7,
).withValues(alpha: 0.15),
backgroundColor: AppColors.pink.withValues(
alpha: 0.15,
),
valueColor: const AlwaysStoppedAnimation<Color>(
Color(0xFFFF55A7),
AppColors.pink,
),
),
),
@@ -304,7 +306,7 @@ class _QuizQuestionScreenState extends State<QuizQuestionScreen> {
: _FallbackIconBlock(
color:
widget.fallbackColor ??
const Color(0xFF2F9E94),
AppColors.teal,
),
const SizedBox(height: 10),
if (hasSuggestedVideo) ...[
@@ -317,7 +319,8 @@ class _QuizQuestionScreenState extends State<QuizQuestionScreen> {
title:
widget
.suggestedVideoTitle ??
'Vídeo',
QuizUiStrings
.videoFallbackTitle,
description: '',
videoPath: widget
.suggestedVideoPath,
@@ -328,13 +331,13 @@ class _QuizQuestionScreenState extends State<QuizQuestionScreen> {
icon: const Icon(
Icons
.play_circle_outline_rounded,
color: Color(0xFF2F9E94),
color: AppColors.teal,
),
label: Text(
widget.suggestedVideoTitle ??
'Ver vídeo (opcional)',
QuizUiStrings.watchOptionalVideo,
style: const TextStyle(
color: Color(0xFF2F9E94),
color: AppColors.teal,
fontWeight: FontWeight.w800,
),
),
@@ -347,7 +350,7 @@ class _QuizQuestionScreenState extends State<QuizQuestionScreen> {
style: const TextStyle(
fontSize: 18,
fontWeight: FontWeight.w900,
color: Color(0xFFFF55A7),
color: AppColors.pink,
height: 1.2,
),
),
@@ -355,11 +358,11 @@ class _QuizQuestionScreenState extends State<QuizQuestionScreen> {
Text(
widget.answerType ==
QuizAnswerType.number
? 'Insira o número'
? QuizUiStrings.enterNumber
: widget.answerType ==
QuizAnswerType.yesNo
? 'Escolha uma opção'
: 'Escolha apenas uma opção',
? QuizUiStrings.chooseOneOption
: QuizUiStrings.chooseOnlyOneOption,
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.black.withValues(
@@ -495,9 +498,7 @@ class _QuizQuestionScreenState extends State<QuizQuestionScreen> {
style:
FilledButton.styleFrom(
backgroundColor:
const Color(
0xFFFF55A7,
),
AppColors.pink,
foregroundColor:
Colors.white,
shape:
@@ -628,8 +629,8 @@ class _QuizQuestionScreenState extends State<QuizQuestionScreen> {
},
child: Text(
widget.isFinal
? 'Concluir'
: 'Avançar',
? QuizUiStrings.finish
: QuizUiStrings.advance,
),
),
),
@@ -643,9 +644,8 @@ class _QuizQuestionScreenState extends State<QuizQuestionScreen> {
),
TextButton(
style: TextButton.styleFrom(
foregroundColor: const Color(
0xFF2F9E94,
),
foregroundColor:
AppColors.teal,
textStyle: const TextStyle(
fontWeight: FontWeight.w800,
),
@@ -663,7 +663,7 @@ class _QuizQuestionScreenState extends State<QuizQuestionScreen> {
(route) => route.isFirst,
),
child: const Text(
'Voltar para homepage',
QuizUiStrings.backToHomepage,
),
),
],
@@ -724,7 +724,7 @@ class _QuizQuestionScreenState extends State<QuizQuestionScreen> {
style: const TextStyle(
fontSize: 24,
fontWeight: FontWeight.w900,
color: Color(0xFF2F9E94),
color: AppColors.teal,
),
decoration: const InputDecoration(
border: InputBorder.none,
@@ -750,10 +750,10 @@ class _QuizQuestionScreenState extends State<QuizQuestionScreen> {
!_numberDontKnow) ...[
const SizedBox(height: 10),
Text(
'Um número tão alto assim não é possível.\nO máximo é $_maxTeethCount.',
QuizUiStrings.teethCountTooHigh(_maxTeethCount),
textAlign: TextAlign.center,
style: const TextStyle(
color: Color(0xFFFF55A7),
color: AppColors.pink,
fontWeight: FontWeight.w700,
fontSize: 12,
),
@@ -780,12 +780,12 @@ class _QuizQuestionScreenState extends State<QuizQuestionScreen> {
),
decoration: BoxDecoration(
color: _numberDontKnow
? const Color(0xFF2F9E94)
? AppColors.teal
: Colors.white.withValues(alpha: 0.70),
borderRadius: BorderRadius.circular(999),
border: Border.all(
color: _numberDontKnow
? const Color(0xFF2F9E94)
? AppColors.teal
: Colors.black.withValues(alpha: 0.12),
),
),
@@ -801,7 +801,7 @@ class _QuizQuestionScreenState extends State<QuizQuestionScreen> {
),
const SizedBox(width: 6),
Text(
'Não sei',
QuizUiStrings.dontKnow,
style: TextStyle(
fontWeight: FontWeight.w800,
fontSize: 13,
@@ -828,7 +828,7 @@ class _QuizAnswerTile extends StatelessWidget {
required this.onTap,
this.imageAspectRatio = 4 / 3,
this.reveal = false,
this.correctLabel = 'Posição certa',
this.correctLabel = QuizUiStrings.defaultCorrectBadgeLabel,
});
final QuizAnswer answer;
@@ -848,9 +848,9 @@ class _QuizAnswerTile extends StatelessWidget {
Widget build(BuildContext context) {
final bool isCorrect = answer.weight == 1;
final borderColor = reveal
? (isCorrect ? const Color(0xFF2F9E94) : const Color(0xFFFF55A7))
? (isCorrect ? AppColors.teal : AppColors.pink)
: selected
? const Color(0xFF2F9E94)
? AppColors.teal
: Colors.black.withValues(alpha: 0.12);
final bg = selected
? Colors.white.withValues(alpha: 0.88)
@@ -934,7 +934,7 @@ class _QuizAnswerTile extends StatelessWidget {
style: const TextStyle(
fontWeight: FontWeight.w900,
fontSize: 15,
color: Color(0xFF2F9E94),
color: AppColors.teal,
),
),
],
@@ -955,7 +955,7 @@ class _QuizAnswerTile extends StatelessWidget {
width: 22,
height: 22,
decoration: const BoxDecoration(
color: Color(0xFF2F9E94),
color: AppColors.teal,
shape: BoxShape.circle,
),
child: const Icon(
@@ -981,8 +981,8 @@ class _QuizAnswerTile extends StatelessWidget {
),
decoration: BoxDecoration(
color: isCorrect
? const Color(0xFF2F9E94)
: const Color(0xFFFF55A7),
? AppColors.teal
: AppColors.pink,
borderRadius: BorderRadius.circular(999),
boxShadow: [
BoxShadow(
@@ -1004,7 +1004,7 @@ class _QuizAnswerTile extends StatelessWidget {
),
const SizedBox(width: 4),
Text(
isCorrect ? correctLabel : 'Posição inadequada',
isCorrect ? correctLabel : QuizUiStrings.incorrectBadgeLabel,
style: const TextStyle(
color: Colors.white,
fontWeight: FontWeight.w800,
@@ -1057,7 +1057,7 @@ class _QuestionReferenceImages extends StatelessWidget {
borderRadius: BorderRadius.circular(999),
),
child: const Text(
'Imagem de referência',
QuizUiStrings.referenceImage,
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.w700,
@@ -1159,12 +1159,12 @@ class _QuizAnswerPill extends StatelessWidget {
@override
Widget build(BuildContext context) {
final accent = _isYes
? const Color(0xFF2F9E94)
? AppColors.teal
: _isNo
? const Color(0xFFFF55A7)
? AppColors.pink
: Colors.black.withValues(alpha: 0.35);
final borderColor = selected
? const Color(0xFF2F9E94)
? AppColors.teal
: Colors.black.withValues(alpha: 0.10);
final helpVideo = _helpVideo;
final showHelp = selected && helpVideo != null;
@@ -1228,7 +1228,7 @@ class _QuizAnswerPill extends StatelessWidget {
style: const TextStyle(
fontWeight: FontWeight.w800,
fontSize: 15,
color: Color(0xFF2F9E94),
color: AppColors.teal,
),
),
),
@@ -1239,11 +1239,11 @@ class _QuizAnswerPill extends StatelessWidget {
decoration: BoxDecoration(
shape: BoxShape.circle,
color: selected
? const Color(0xFF2F9E94)
? AppColors.teal
: Colors.transparent,
border: Border.all(
color: selected
? const Color(0xFF2F9E94)
? AppColors.teal
: Colors.black.withValues(alpha: 0.25),
width: 1.6,
),
@@ -1291,7 +1291,7 @@ class _HelpVideoButton extends StatelessWidget {
return TapBounce(
scale: 0.97,
child: Material(
color: const Color(0xFF2F9E94).withValues(alpha: 0.10),
color: AppColors.teal.withValues(alpha: 0.10),
borderRadius: BorderRadius.circular(14),
child: InkWell(
borderRadius: BorderRadius.circular(14),
@@ -1302,23 +1302,23 @@ class _HelpVideoButton extends StatelessWidget {
children: [
const Icon(
Icons.play_circle_fill_rounded,
color: Color(0xFF2F9E94),
color: AppColors.teal,
size: 22,
),
const SizedBox(width: 10),
Expanded(
child: Text(
'Não tem a certeza? Veja o "${video.title}" para ajudar a responder',
QuizUiStrings.notSureSeeVideo(video.title),
style: const TextStyle(
fontWeight: FontWeight.w700,
fontSize: 12.5,
color: Color(0xFF2F9E94),
color: AppColors.teal,
),
),
),
const Icon(
Icons.chevron_right_rounded,
color: Color(0xFF2F9E94),
color: AppColors.teal,
size: 20,
),
],

View File

@@ -1,9 +1,12 @@
import 'dart:async';
import 'package:flutter/material.dart';
import '../colors/app_colors.dart';
import '../main.dart' show supabase;
import '../widgets/app_gradients.dart';
import '../colors/app_gradients.dart';
import '../strings/quiz_result_strings.dart';
import '../strings/quiz_ui_strings.dart';
import '../widgets/entrance.dart';
import '../widgets/liquid_waves_background.dart';
import '../widgets/tap_bounce.dart';
@@ -106,20 +109,8 @@ class _QuizResultScreenState extends State<QuizResultScreen> {
MaterialPageRoute<void>(
builder: (_) => QuizVideoGuideScreen(
youtubeId: _resultGuideYoutubeId,
heading: 'Visualize o seguinte vídeo',
caption:
'Assista para compreender a importância de um diagnóstico '
'precoce e de realizar tratamento ortodôntico intercetivo, '
'ou seja, uma intervenção realizada na infância, tipicamente '
'durante a fase de dentição mista (presença tanto de dentes '
'de leite como de permanentes).\n\nO seu propósito é '
'identificar, prevenir ou reduzir a gravidade de maloclusões '
'e problemas no desenvolvimento dos maxilares enquanto os '
'ossos e dentes ainda estão em crescimento.\n\nEsta '
'intervenção aproveita a fase de desenvolvimento craniofacial '
'para influenciar o crescimento ósseo, redirecionar a '
'mandíbula, corrigir o alinhamento dos maxilares ou criar '
'espaço para a erupção correta dos dentes permanentes.',
heading: QuizResultStrings.watchTheFollowingVideo,
caption: QuizResultStrings.resultVideoCaption,
onAdvance: (context) =>
Navigator.of(context).popUntil((r) => r.isFirst),
),
@@ -137,7 +128,7 @@ class _QuizResultScreenState extends State<QuizResultScreen> {
body: Stack(
clipBehavior: Clip.none,
children: [
Positioned.fill(child: Container(color: const Color(0xFFFAFAF7))),
Positioned.fill(child: Container(color: AppColors.background)),
const LiquidWavesBackground(),
SafeArea(
child: Center(
@@ -157,12 +148,12 @@ class _QuizResultScreenState extends State<QuizResultScreen> {
const SizedBox(height: 10),
FadeSlideIn(
child: const Text(
'O resultado avaliado é de:',
QuizResultStrings.resultHeading,
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.w900,
color: Color(0xFFFF55A7),
color: AppColors.pink,
height: 1.2,
),
),
@@ -177,15 +168,16 @@ class _QuizResultScreenState extends State<QuizResultScreen> {
_ResultRing(
value: signs,
max: kSignsMax,
color: const Color(0xFF2F9E94),
color: AppColors.teal,
label:
'Sinais de má\noclusão instalados',
QuizResultStrings.signsRingLabel,
),
_ResultRing(
value: factors,
max: kFactorsMax,
color: const Color(0xFFFF55A7),
label: 'Fatores de\nrisco associados',
color: AppColors.pink,
label:
QuizResultStrings.factorsRingLabel,
),
],
),
@@ -194,14 +186,15 @@ class _QuizResultScreenState extends State<QuizResultScreen> {
FadeSlideIn(
delay: const Duration(milliseconds: 100),
child: _ResultSection(
heading: 'Conclusões:',
body:
'Foram identificados $signs de $kSignsMax '
'sinais de má oclusão já instalada e '
'$factors de $kFactorsMax fatores de '
'risco frequentemente associados a '
'má oclusão.',
bodyColor: const Color(0xFFFF55A7),
heading:
QuizResultStrings.conclusionsHeading,
body: QuizResultStrings.conclusionsBody(
signs: signs,
signsMax: kSignsMax,
factors: factors,
factorsMax: kFactorsMax,
),
bodyColor: AppColors.pink,
bodyWeight: FontWeight.w800,
),
),
@@ -209,19 +202,23 @@ class _QuizResultScreenState extends State<QuizResultScreen> {
FadeSlideIn(
delay: const Duration(milliseconds: 140),
child: _ResultSection(
heading: 'O que deve fazer agora',
heading:
QuizResultStrings.whatToDoNowHeading,
body: recommend
? 'Com base neste resultado, recomendamos a marcação de uma consulta com Odontopediatra ou Ortodontista para uma avaliação presencial.'
: 'Não foram encontrados sinais ou fatores de risco relevantes. Continue a acompanhar a saúde oral do seu filho/a com as consultas de rotina habituais.',
? QuizResultStrings
.whatToDoNowRecommend
: QuizResultStrings
.whatToDoNowNoConcerns,
),
),
const SizedBox(height: 16),
FadeSlideIn(
delay: const Duration(milliseconds: 180),
child: _ResultSection(
heading: 'Importante saber',
body:
'Este resultado não substitui uma avaliação presencial, nem tem função de diagnóstico. O objetivo é ajudá-lo a estar mais atento aos sinais identificados e a não adiar uma consulta que pode fazer a diferença no desenvolvimento oral do seu filho/a.',
heading: QuizResultStrings
.importantToKnowHeading,
body: QuizResultStrings
.importantToKnowBody,
),
),
],
@@ -254,7 +251,7 @@ class _QuizResultScreenState extends State<QuizResultScreen> {
if (!context.mounted) return;
_goToVideo();
},
child: const Text('Avançar'),
child: const Text(QuizUiStrings.advance),
),
),
),

View File

@@ -1,12 +1,14 @@
import 'package:flutter/material.dart';
import '../colors/app_colors.dart';
import 'package:youtube_player_flutter/youtube_player_flutter.dart';
import '../strings/quiz_ui_strings.dart';
import '../widgets/entrance.dart';
import '../widgets/liquid_waves_background.dart';
import '../widgets/tap_bounce.dart';
const Color _pink = Color(0xFFFF55A7);
const Color _teal = Color(0xFF2F9E94);
const Color _pink = AppColors.pink;
const Color _teal = AppColors.teal;
/// Player do YouTube incorporado (sem AppBar/tela cheia própria) — usado
/// tanto no ecrã intersticial [QuizVideoGuideScreen] como embutido
@@ -78,9 +80,9 @@ class QuizVideoGuideScreen extends StatefulWidget {
super.key,
required this.youtubeId,
required this.onAdvance,
this.heading = 'Antes de continuar, veja o vídeo educativo...',
this.heading = QuizUiStrings.defaultVideoGuideHeading,
this.caption =
'Veja o vídeo para compreender melhor as próximas perguntas do questionário.',
QuizUiStrings.defaultVideoGuideCaption,
this.extraHeading,
this.extraSubtitle,
});
@@ -122,7 +124,7 @@ class _QuizVideoGuideScreenState extends State<QuizVideoGuideScreen> {
body: Stack(
clipBehavior: Clip.none,
children: [
Positioned.fill(child: Container(color: const Color(0xFFFAFAF7))),
Positioned.fill(child: Container(color: AppColors.background)),
const LiquidWavesBackground(),
SafeArea(
child: Padding(
@@ -135,7 +137,7 @@ class _QuizVideoGuideScreenState extends State<QuizVideoGuideScreen> {
child: TextButton(
onPressed: _advance,
child: const Text(
'Pular',
QuizUiStrings.skip,
style: TextStyle(
color: Colors.black45,
fontWeight: FontWeight.w700,
@@ -243,7 +245,7 @@ class _QuizVideoGuideScreenState extends State<QuizVideoGuideScreen> {
),
),
onPressed: _videoWatched ? _advance : null,
child: const Text('Avançar'),
child: const Text(QuizUiStrings.advance),
),
),
),