CTK 1.0.2

This commit is contained in:
Carlos Correia
2026-07-15 17:46:14 +01:00
parent 9c21887fc7
commit 3214a07779
9 changed files with 211 additions and 150 deletions

View File

@@ -13,11 +13,12 @@ import 'quiz_video_guide.dart';
const String _resultGuideYoutubeId = '3q7C7txH1dE';
// Fase 3 tem 28 perguntas no total: 5 são sinais de má oclusão já
// instalados (queixo, boca/dentição, apinhamento, boca/dentição 2, céu da
// boca) — as restantes 23 são fatores de risco associados. Ver o diagrama
// de planeamento partilhado com o utilizador para o racional completo.
const int kSignsMax = 5;
// Fase 3 tem 29 perguntas no total: 6 são sinais de má oclusão já
// instalados (queixo, boca/dentição, apinhamento, boca/dentição 2,
// boca/dentição 3, céu da boca) — as restantes 23 são fatores de risco
// associados. Ver o diagrama de planeamento partilhado com o utilizador
// para o racional completo.
const int kSignsMax = 6;
const int kFactorsMax = 23;
/// A partir de quantos sinais/fatores presentes se recomenda avaliação.
@@ -73,13 +74,16 @@ class _QuizResultScreenState extends State<QuizResultScreen> {
scope.startsWith('${userId}_')) {
final childId = scope.substring(userId.length + 1).trim();
if (childId.isNotEmpty) {
// Fire-and-forget: avoid blocking UI on erros de rede. Requer as
// Aguarda a gravação (em vez de fire-and-forget) para que, ao voltar
// à Home logo a seguir, _loadQuizResult já encontre o valor novo na
// base de dados — caso contrário havia uma corrida em que a Home
// consultava a tabela antes desta escrita terminar, mostrando o
// resultado antigo até trocar de aba ou reabrir a app. Requer as
// colunas last_signs/last_signs_max/last_factors/last_factors_max
// na tabela children — se ainda não existirem na base de dados,
// esta chamada falha silenciosamente e o resultado fica só local
// (SharedPreferences, acima), tal como já acontecia antes.
unawaited(
supabase
// na tabela children — se ainda não existirem, falha silenciosamente
// e o resultado fica só local (SharedPreferences, acima).
try {
await supabase
.from('children')
.update({
'last_signs': widget.finalScore.signs,
@@ -87,13 +91,12 @@ class _QuizResultScreenState extends State<QuizResultScreen> {
'last_factors': widget.finalScore.factors,
'last_factors_max': kFactorsMax,
})
.eq('id', childId)
.catchError((e) {
debugPrint(
'[QuizResult] Falha ao gravar score na base de dados: $e',
);
}),
);
.eq('id', childId);
} catch (e) {
debugPrint(
'[QuizResult] Falha ao gravar score na base de dados: $e',
);
}
}
}
}
@@ -112,7 +115,11 @@ class _QuizResultScreenState extends State<QuizResultScreen> {
'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.',
'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.',
onAdvance: (context) =>
Navigator.of(context).popUntil((r) => r.isFirst),
),