Documentação

This commit is contained in:
Carlos Correia
2026-05-03 23:31:31 +01:00
commit d24cb3242a
167 changed files with 14263 additions and 0 deletions

433
lib/quiz/quiz_random.dart Normal file
View File

@@ -0,0 +1,433 @@
import 'dart:math';
import 'package:flutter/material.dart';
import 'quiz_question_screen.dart';
import 'quiz_result.dart';
class QuizRandomScreen extends StatefulWidget {
const QuizRandomScreen({super.key, this.currentScore = 0, this.scopeId});
final int currentScore;
final String? scopeId;
@override
State<QuizRandomScreen> createState() => _QuizRandomScreenState();
}
class _QuizRandomScreenState extends State<QuizRandomScreen> {
final List<QuizQuestion> _allQuestions = [
QuizQuestion(
id: 1,
title: 'Quiz 1/15',
question: 'Qual é o tempo ideal para escovar os dentes?',
answers: const [
QuizAnswer(
title: 'Cerca de 2 minutos',
description: 'O recomendado é escovar por aproximadamente 2 minutos, cobrindo todas as superfícies dos dentes e a linha da gengiva sem pressa.',
weight: 2,
),
QuizAnswer(
title: 'Só 30 segundos, se fizer rápido',
description: 'Muito pouco tempo costuma deixar placa bacteriana para trás, principalmente nos dentes de trás e perto da gengiva.',
weight: 5,
),
QuizAnswer(
title: '5 minutos com força para "limpar bem"',
description: 'Tempo demais e força excessiva podem irritar a gengiva e desgastar o esmalte. Prefira movimentos suaves e tempo adequado.',
weight: 3,
),
],
),
QuizQuestion(
id: 2,
title: 'Quiz 2/15',
question: 'Quando devo trocar a escova de dentes?',
answers: const [
QuizAnswer(
title: 'A cada 3 meses (ou antes se estragar)',
description: 'O ideal é trocar a cada ~3 meses. Se as cerdas abrirem antes, troque antes. Cerdas abertas limpam pior.',
weight: 2,
),
QuizAnswer(
title: 'Só quando a escova "quebrar"',
description: 'Esperar demais reduz a eficiência da escovação e pode acumular microrganismos na escova.',
weight: 5,
),
QuizAnswer(
title: 'Todo mês, obrigatoriamente',
description: 'Não é regra fixa. Um mês pode ser cedo demais se a escova estiver em bom estado. O principal é o estado das cerdas.',
weight: 3,
),
],
),
QuizQuestion(
id: 3,
title: 'Quiz 3/15',
question: 'Qual a quantidade ideal de pasta de dente para crianças?',
answers: const [
QuizAnswer(
title: 'Um grão de arroz (pequenos) / ervilha (maiores)',
description: 'Para crianças pequenas, um "grão de arroz" já basta. Conforme cresce, pode ser do tamanho de uma ervilha. Isso ajuda a evitar excesso de flúor ingerido.',
weight: 2,
),
QuizAnswer(
title: 'Cobrir toda a escova com pasta',
description: 'Muito produto não significa melhor limpeza. Em crianças, aumenta o risco de engolir pasta em excesso.',
weight: 5,
),
QuizAnswer(
title: 'Nenhuma pasta, só água',
description: 'A pasta com flúor (na quantidade correta) ajuda a prevenir cáries. Em geral, água sozinha não oferece a mesma proteção.',
weight: 3,
),
],
),
QuizQuestion(
id: 4,
title: 'Quiz 4/15',
question: 'Qual é o melhor horário para usar fio dental?',
answers: const [
QuizAnswer(
title: 'Uma vez ao dia, com calma (geralmente à noite)',
description: 'O importante é a frequência diária. À noite costuma ser mais fácil, pois remove restos e placa antes de dormir.',
weight: 2,
),
QuizAnswer(
title: 'Só quando algo fica preso',
description: 'O fio dental não serve apenas para tirar restos visíveis; ele remove placa bacteriana entre os dentes onde a escova não alcança.',
weight: 5,
),
QuizAnswer(
title: 'Depois de toda refeição (obrigatório)',
description: 'Pode ser útil em alguns casos, mas não é obrigatório para todos. O essencial é fazer bem feito ao menos 1x ao dia.',
weight: 3,
),
],
),
QuizQuestion(
id: 5,
title: 'Quiz 5/15',
question: 'O que ajuda mais a prevenir cáries no dia a dia?',
answers: const [
QuizAnswer(
title: 'Escovar + flúor + reduzir açúcar frequente',
description: 'A prevenção é um conjunto: boa higiene com flúor e menos "beliscos" açucarados ao longo do dia.',
weight: 2,
),
QuizAnswer(
title: 'Só enxaguante bucal',
description: 'Enxaguante pode ajudar em alguns casos, mas não substitui escovação e fio dental.',
weight: 3,
),
QuizAnswer(
title: 'Evitar completamente dentista',
description: 'Consultas regulares são importantes para prevenção e orientação. O dentista também identifica problemas bem no começo.',
weight: 5,
),
],
),
QuizQuestion(
id: 6,
title: 'Quiz 6/15',
question: 'Qual tipo de escova é mais recomendada para crianças?',
answers: const [
QuizAnswer(
title: 'Escova macia com cabeça pequena',
description: 'Escovas macias protegem a gengiva sensível das crianças e a cabeça pequena alcança melhor todos os dentes.',
weight: 2,
),
QuizAnswer(
title: 'Escova dura para limpar melhor',
description: 'Escovas duras podem machucar a gengiva e desgastar o esmalte dos dentes das crianças.',
weight: 5,
),
QuizAnswer(
title: 'Escova elétrica sempre é melhor',
description: 'Escova elétrica pode ajudar, mas não é essencial. O mais importante é a técnica e frequência.',
weight: 3,
),
],
),
QuizQuestion(
id: 7,
title: 'Quiz 7/15',
question: 'Qual alimento é mais prejudicial para os dentes?',
answers: const [
QuizAnswer(
title: 'Balas e chicletes pegajosos',
description: 'Alimentos pegajosos ficam presos nos dentes por mais tempo, aumentando o risco de cáries.',
weight: 2,
),
QuizAnswer(
title: 'Maçã e cenoura',
description: 'Frutas e vegetais crus ajudam a limpar os dentes naturalmente e são saudáveis.',
weight: 5,
),
QuizAnswer(
title: 'Água e leite',
description: 'Água ajuda a limpar e leite tem cálcio. São opções saudáveis para os dentes.',
weight: 3,
),
],
),
QuizQuestion(
id: 8,
title: 'Quiz 8/15',
question: 'Quando deve ser a primeira visita ao dentista?',
answers: const [
QuizAnswer(
title: 'Por volta dos 1 ano de idade',
description: 'A primeira visita deve ser assim que o primeiro dentinho nascer ou até o primeiro aniversário.',
weight: 2,
),
QuizAnswer(
title: 'Só quando tiver todos os dentes',
description: 'Esperar demais pode permitir que problemas comecem sem detecção precoce.',
weight: 5,
),
QuizAnswer(
title: 'Apenas se sentir dor',
description: 'Dor geralmente indica que o problema já está avançado. Prevenção é melhor que tratamento.',
weight: 5,
),
],
),
QuizQuestion(
id: 9,
title: 'Quiz 9/15',
question: 'Até que idade é aceitável usar chupeta?',
answers: const [
QuizAnswer(
title: 'Até 2-3 anos no máximo',
description: 'Após 2-3 anos, chupeta pode causar problemas na dentição e no desenvolvimento da fala.',
weight: 2,
),
QuizAnswer(
title: 'Até 6-7 anos',
description: 'Essa idade já é muito tarde e pode causar problemas sérios na arcada dentária.',
weight: 5,
),
QuizAnswer(
title: 'Não tem problema usar sempre',
description: 'Uso prolongado pode causar má oclusão, problemas na fala e alterações faciais.',
weight: 5,
),
],
),
QuizQuestion(
id: 10,
title: 'Quiz 10/15',
question: 'O flúor na água de abastecimento ajuda?',
answers: const [
QuizAnswer(
title: 'Sim, reduz cáries em até 60%',
description: 'Flúor na água é uma das medidas de saúde pública mais eficazes na prevenção de cáries.',
weight: 2,
),
QuizAnswer(
title: 'Não faz diferença nenhuma',
description: 'Estudos comprovam que flúor na água reduz significativamente a incidência de cáries.',
weight: 5,
),
QuizAnswer(
title: 'É perigoso e causa problemas',
description: 'Nas concentrações corretas, flúor é seguro. O problema é o excesso, não o uso adequado.',
weight: 4,
),
],
),
QuizQuestion(
id: 11,
title: 'Quiz 11/15',
question: 'Por que a escovação noturna é tão importante?',
answers: const [
QuizAnswer(
title: 'Menos saliva durante o sono',
description: 'Durante a noite produzimos menos saliva, que protege os dentes. Escovação remove placa antes desse período vulnerável.',
weight: 2,
),
QuizAnswer(
title: 'É igual aos outros horários',
description: 'A noite é especial porque a produção de saliva diminui, aumentando o risco de cáries.',
weight: 4,
),
QuizAnswer(
title: 'Só por tradição',
description: 'Tem fundamento científico. A noite é o período mais crítico para formação de cáries.',
weight: 5,
),
],
),
QuizQuestion(
id: 12,
title: 'Quiz 12/15',
question: 'Qual bebida é mais ácida para os dentes?',
answers: const [
QuizAnswer(
title: 'Refrigerantes e sucos industrializados',
description: 'Refrigerantes e sucos artificiais têm pH muito baixo, corroem o esmalte e causam erosão dental.',
weight: 2,
),
QuizAnswer(
title: 'Água e leite',
description: 'Água tem pH neutro e leite é levemente ácido mas protege os dentes com cálcio.',
weight: 5,
),
QuizAnswer(
title: 'Chá sem açúcar',
description: 'Chá pode manchar mas é muito menos ácido que refrigerantes e sucos artificiais.',
weight: 3,
),
],
),
QuizQuestion(
id: 13,
title: 'Quiz 13/15',
question: 'É importante cuidar dos dentes de leite?',
answers: const [
QuizAnswer(
title: 'Sim, são fundamentais para o desenvolvimento',
description: 'Dentes de leite mantêm espaço para os permanentes, auxiliam na fala e mastigação.',
weight: 2,
),
QuizAnswer(
title: 'Não, vão cair de qualquer jeito',
description: 'Dentes de leite doentes podem afetar os permanentes e causar problemas no desenvolvimento.',
weight: 5,
),
QuizAnswer(
title: 'Só se doerem',
description: 'Mesmo sem dor, problemas nos dentes de leite podem ter consequências sérias futuras.',
weight: 4,
),
],
),
QuizQuestion(
id: 14,
title: 'Quiz 14/15',
question: 'Qual é a técnica correta de escovação?',
answers: const [
QuizAnswer(
title: 'Movimentos circulares suaves',
description: 'Movimentos circulares ou vibratórios suaves limpam sem machucar a gengiva e removem a placa eficientemente.',
weight: 2,
),
QuizAnswer(
title: 'Força de um lado para o outro',
description: 'Movimentos horizontais fortes podem machucar a gengiva e causar recessão gengival.',
weight: 5,
),
QuizAnswer(
title: 'Só na frente dos dentes',
description: 'Precisa escovar todas as faces: frente, atrás e superfície de mastigação.',
weight: 4,
),
],
),
QuizQuestion(
id: 15,
title: 'Quiz 15/15',
question: 'Para que servem os selantes dentários?',
answers: const [
QuizAnswer(
title: 'Proteger sulcos dos dentes contra cáries',
description: 'Selantes são uma resina que preenche sulcos e fissuras dos dentes, protegendo contra cáries.',
weight: 2,
),
QuizAnswer(
title: 'Clarear os dentes',
description: 'Selantes não têm função estética de clareamento, apenas protetiva contra cáries.',
weight: 5,
),
QuizAnswer(
title: 'Substituir a escovação',
description: 'Selantes complementam a higiene, não substituem a escovação e o fio dental.',
weight: 4,
),
],
),
];
late List<QuizQuestion> _shuffledQuestions;
int _currentQuestionIndex = 0;
int _currentScore = 0;
final Random _random = Random();
@override
void initState() {
super.initState();
_currentScore = widget.currentScore;
_shuffledQuestions = List.from(_allQuestions)..shuffle(_random);
}
void _nextQuestion(int scoreToAdd) {
setState(() {
_currentScore += scoreToAdd;
_currentQuestionIndex++;
});
if (_currentQuestionIndex >= _shuffledQuestions.length) {
// Quiz finished
Navigator.of(context).pushReplacement(
MaterialPageRoute<void>(
builder: (_) => QuizResultScreen(
finalScore: _currentScore,
maxScore: 75, // 15 questions * 5 max points
scopeId: widget.scopeId,
),
),
);
}
}
@override
Widget build(BuildContext context) {
if (_currentQuestionIndex >= _shuffledQuestions.length) {
return const Scaffold(body: Center(child: CircularProgressIndicator()));
}
final currentQuestion = _shuffledQuestions[_currentQuestionIndex];
final isLastQuestion = _currentQuestionIndex == _shuffledQuestions.length - 1;
return QuizQuestionScreen(
title: currentQuestion.title,
question: currentQuestion.question,
answers: currentQuestion.answers,
currentScore: _currentScore,
nextRoute: (context, nextScore) {
_nextQuestion(nextScore - _currentScore);
return MaterialPageRoute<void>(
builder: (_) => const SizedBox.shrink(),
);
},
isFinal: isLastQuestion,
showBackButton: _currentQuestionIndex > 0,
onFinished: isLastQuestion ? () {
Navigator.of(context).pushReplacement(
MaterialPageRoute<void>(
builder: (_) => QuizResultScreen(
finalScore: _currentScore,
maxScore: 75,
scopeId: widget.scopeId,
),
),
);
} : null,
);
}
}
class QuizQuestion {
final int id;
final String title;
final String question;
final List<QuizAnswer> answers;
QuizQuestion({
required this.id,
required this.title,
required this.question,
required this.answers,
});
}