Untitled

 avatar
unknown
plain_text
19 days ago
21 kB
4
Indexable
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Especializacare',
      theme: ThemeData(
        primarySwatch: Colors.pink,
        scaffoldBackgroundColor: Colors.white,
      ),
      home: const WelcomeScreen(),
    );
  }
}

// 🔹 Tela de Boas-Vindas Moderna
class WelcomeScreen extends StatelessWidget {
  const WelcomeScreen({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        width: double.infinity,
        decoration: const BoxDecoration(
          gradient: LinearGradient(
            colors: [Colors.redAccent, Colors.pinkAccent],
            begin: Alignment.topLeft,
            end: Alignment.bottomRight,
          ),
        ),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Image.asset('assets/logo.png', height: 180), // Substitua pelo seu logo

            Text(
              "Especializacare",
              style: GoogleFonts.poppins(
                fontSize: 36,
                fontWeight: FontWeight.bold,
                color: Colors.white,
              ),
            ),
            const SizedBox(height: 10),

            Text(
              "Seu cuidado especializado, a um clique de distância!",
              textAlign: TextAlign.center,
              style: GoogleFonts.poppins(fontSize: 16, color: Colors.white70),
            ),
            const SizedBox(height: 40),

            ElevatedButton(
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(
                      builder: (context) => const PatientRegistrationScreen()),
                );
              },
              style: ElevatedButton.styleFrom(
                backgroundColor: Colors.white,
                padding:
                    const EdgeInsets.symmetric(horizontal: 40, vertical: 15),
                shape: RoundedRectangleBorder(
                    borderRadius: BorderRadius.circular(30)),
                elevation: 5,
              ),
              child: Text(
                "Começar",
                style: GoogleFonts.poppins(
                    fontSize: 18,
                    fontWeight: FontWeight.bold,
                    color: Colors.pink),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

// 🔹 Tela de Cadastro Prévio do Paciente
class PatientRegistrationScreen extends StatefulWidget {
  const PatientRegistrationScreen({super.key});

  @override
  State<PatientRegistrationScreen> createState() =>
      _PatientRegistrationScreenState();
}

class _PatientRegistrationScreenState extends State<PatientRegistrationScreen> {
  final _formKey = GlobalKey<FormState>();
  final TextEditingController _nameController = TextEditingController();
  final TextEditingController _ageController = TextEditingController();
  final TextEditingController _weightController = TextEditingController();
  final TextEditingController _heightController = TextEditingController();

  // Função auxiliar para converter string para double, tratando a vírgula como decimal
  double? parseStringToDouble(String? value) {
    if (value == null || value.isEmpty) {
      return null;
    }
    final cleanedValue = value.replaceAll(',', '.');
    return double.tryParse(cleanedValue);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("Cadastro"), backgroundColor: Colors.pink),
      body: Padding(
        padding: const EdgeInsets.all(20.0),
        child: Form(
          key: _formKey,
          child: Column(
            children: <Widget>[
              TextFormField(
                controller: _nameController,
                decoration: const InputDecoration(labelText: 'Nome Completo'),
                validator: (value) {
                  if (value == null || value.isEmpty) {
                    return 'Por favor, digite seu nome.';
                  }
                  return null;
                },
              ),
              TextFormField(
                controller: _ageController,
                keyboardType: TextInputType.number,
                decoration: const InputDecoration(labelText: 'Idade'),
                validator: (value) {
                  if (value == null || value.isEmpty) {
                    return 'Por favor, digite sua idade.';
                  }
                  final age = int.tryParse(value);
                  if (age == null || age <= 0) {
                    return 'Por favor, digite uma idade válida.';
                  }
                  return null;
                },
              ),
              TextFormField(
                controller: _weightController,
                keyboardType: TextInputType.number,
                decoration: const InputDecoration(labelText: 'Peso (em kg)'),
                validator: (value) {
                  final weight = parseStringToDouble(value);
                  if (weight == null || weight <= 0) {
                    return 'Por favor, digite um peso válido.';
                  }
                  return null;
                },
              ),
              TextFormField(
                controller: _heightController,
                keyboardType: TextInputType.number,
                decoration: const InputDecoration(labelText: 'Altura (em metros)'),
                validator: (value) {
                  final height = parseStringToDouble(value);
                  if (height == null || height <= 0) {
                    return 'Por favor, digite uma altura válida.';
                  }
                  return null;
                },
              ),
              const SizedBox(height: 20),
              ElevatedButton(
                onPressed: () {
                  if (_formKey.currentState!.validate()) {
                    Navigator.push(
                      context,
                      MaterialPageRoute(
                        builder: (context) => AppointmentSchedulingScreen(
                          weight: parseStringToDouble(_weightController.text) ?? 0.0,
                          height: parseStringToDouble(_heightController.text) ?? 0.0,
                        ),
                      ),
                    );
                  }
                },
                style: ElevatedButton.styleFrom(
                  backgroundColor: Colors.pink,
                  padding:
                      const EdgeInsets.symmetric(horizontal: 40, vertical: 15),
                  shape: RoundedRectangleBorder(
                      borderRadius: BorderRadius.circular(30)),
                ),
                child: const Text("Continuar para Agendamento",
                    style: TextStyle(color: Colors.white)),
              ),
            ],
          ),
        ),
      ),
    );
  }

  @override
  void dispose() {
    _nameController.dispose();
    _ageController.dispose();
    _weightController.dispose();
    _heightController.dispose();
    super.dispose();
  }
}

// 🔹 Tela para Fazer o Agendamento com os Médicos Disponíveis
class AppointmentSchedulingScreen extends StatefulWidget {
  final double weight;
  final double height;

  const AppointmentSchedulingScreen({super.key, required this.weight, required this.height});

  @override
  State<AppointmentSchedulingScreen> createState() =>
      _AppointmentSchedulingScreenState();
}

class _AppointmentSchedulingScreenState
    extends State<AppointmentSchedulingScreen> {
  String? _selectedDoctor;
  DateTime? _selectedDate;
  TimeOfDay? _selectedTime;

  final List<Map<String, String>> _availableDoctors = [
    {'name': 'Dra. Ana Paula', 'description': 'Cardiologista com foco em prevenção.'},
    {'name': 'Dr. Carlos Alberto', 'description': 'Dermatologista especialista em acne e rosácea.'},
    {'name': 'Dr. Mariana Silva', 'description': 'Pediatra com experiência em desenvolvimento infantil.'},
    {'name': 'Dr. João Pedro', 'description': 'Clínico Geral para consultas de rotina e check-ups.'},
    {'name': 'Dra. Sofia Mendes', 'description': 'Ginecologista e obstetra.'},
    {'name': 'Dr. Ricardo Alves', 'description': 'Ortopedista especializado em lesões esportivas.'},
    {'name': 'Dra. Laura Castro', 'description': 'Oftalmologista com foco em cirurgia refrativa.'},
    {'name': 'Dr. Gustavo Ferreira', 'description': 'Neurologista especialista em dores de cabeça.'},
    {'name': 'Dra. Patrícia Oliveira', 'description': 'Endocrinologista com experiência em diabetes.'},
    {'name': 'Dr. Bruno Rocha', 'description': 'Urologista geral.'},
    {'name': 'Dra. Amanda Souza', 'description': 'Psiquiatra com abordagem integrativa.'},
    {'name': 'Dr. Rafael Costa', 'description': 'Gastroenterologista especialista em doenças inflamatórias intestinais.'},
    {'name': 'Dra. Isabela Pereira', 'description': 'Reumatologista com foco em artrite reumatoide.'},
    {'name': 'Dr. Lucas Gomes', 'description': 'Otorrinolaringologista.'},
    {'name': 'Dra. Fernanda Nunes', 'description': 'Pneumologista especialista em asma.'},
    {'name': 'Dr. Eduardo Vieira', 'description': 'Nefrologista.'},
    {'name': 'Dra. Carolina Martins', 'description': 'Hematologista.'},
    {'name': 'Dr. Thiago Santos', 'description': 'Infectologista.'},
    {'name': 'Dra. Juliana Ribeiro', 'description': 'Alergista e imunologista.'},
    {'name': 'Dr. Leonardo Sousa', 'description': 'Cirurgião geral.'},
    {'name': 'Dra. Beatriz Oliveira', 'description': 'Cardiologista intervencionista.'},
    {'name': 'Dr. Vinícius Costa', 'description': 'Dermatologista com foco em estética.'},
    {'name': 'Dra. Camila Ferreira', 'description': 'Pediatra especialista em neonatologia.'},
    {'name': 'Dr. André Rocha', 'description': 'Clínico Geral com foco em geriatria.'},
    {'name': 'Dra. Manuela Mendes', 'description': 'Ginecologista especialista em fertilidade.'},
    {'name': 'Dr. Pedro Alves', 'description': 'Ortopedista especialista em cirurgia de joelho.'},
    {'name': 'Dra. Renata Castro', 'description': 'Oftalmologista especialista em glaucoma.'},
    {'name': 'Dr. Marcelo Ferreira', 'description': 'Neurologista especialista em epilepsia.'},
    {'name': 'Dra. Simone Oliveira', 'description': 'Endocrinologista com foco em tireoide.'},
    {'name': 'Dr. Gustavo Rocha', 'description': 'Urologista especialista em oncologia.'},
  ];

  Future<void> _selectDate(BuildContext context) async {
    final DateTime? picked = await showDatePicker(
      context: context,
      initialDate: DateTime.now(),
      firstDate: DateTime.now(),
      lastDate: DateTime(2026),
    );
    if (picked != null && picked != _selectedDate) {
      setState(() {
        _selectedDate = picked;
      });
    }
  }

  Future<void> _selectTime(BuildContext context) async {
    final TimeOfDay? picked = await showTimePicker(
      context: context,
      initialTime: TimeOfDay.now(),
    );
    if (picked != null && picked != _selectedTime) {
      setState(() {
        _selectedTime = picked;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("Agendamento"), backgroundColor: Colors.pink),
      body: Padding(
        padding: const EdgeInsets.all(20.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            DropdownButtonFormField<Map<String, String>>(
              decoration: const InputDecoration(labelText: 'Selecione o Médico'),
              value: _availableDoctors.firstWhere((doctor) => doctor['name'] == _selectedDoctor, orElse: () => _availableDoctors.first),
              items: _availableDoctors.map((Map<String, String> doctor) {
                return DropdownMenuItem<Map<String, String>>(
                  value: doctor,
                  child: Text(doctor['name']!),
                );
              }).toList(),
              onChanged: (Map<String, String>? newValue) {
                setState(() {
                  _selectedDoctor = newValue?['name'];
                });
              },
              validator: (value) {
                if (value == null) {
                  return 'Por favor, selecione um médico.';
                }
                return null;
              },
            ),
            // Aqui você pode adicionar um widget para exibir a descrição do médico selecionado
            // Exemplo:
            // if (_selectedDoctor != null) {
            //   Text(_availableDoctors.firstWhere((doctor) => doctor['name'] == _selectedDoctor)['description']!);
            // }
            const SizedBox(height: 20),
            Row(
              children: <Widget>[
                Expanded(
                  child: Text(
                    _selectedDate == null
                        ? 'Nenhuma data selecionada'
                        : 'Data: ${_selectedDate!.day}/${_selectedDate!.month}/${_selectedDate!.year}',
                  ),
                ),
                ElevatedButton(
                  onPressed: () => _selectDate(context),
                  child: const Text('Selecionar Data'),
                ),
              ],
            ),
            const SizedBox(height: 20),
            Row(
              children: <Widget>[
                Expanded(
                  child: Text(
                    _selectedTime == null
                        ? 'Nenhum horário selecionado'
                        : 'Horário: ${_selectedTime!.format(context)}',
                  ),
                ),
                ElevatedButton(
                  onPressed: () => _selectTime(context),
                  child: const Text('Selecionar Horário'),
                ),
              ],
            ),
            const SizedBox(height: 40),
            ElevatedButton(
              onPressed: () {
                if (_selectedDoctor != null &&
                    _selectedDate != null &&
                    _selectedTime != null) {
                  final selectedDoctorData = _availableDoctors.firstWhere((doctor) => doctor['name'] == _selectedDoctor);
                  Navigator.push(
                    context,
                    MaterialPageRoute(
                      builder: (context) => AppointmentConfirmationScreen(
                        doctor: _selectedDoctor!,
                        date: _selectedDate!,
                        time: _selectedTime!,
                        weight: widget.weight,
                        height: widget.height,
                        doctorDescription: selectedDoctorData['description']!, // Passando a descrição
                      ),
                    ),
                  );
                } else {
                  ScaffoldMessenger.of(context).showSnackBar(
                    const SnackBar(
                      content: Text(
                          'Por favor, selecione o médico, a data e o horário.')),
                  );
                }
              },
              style: ElevatedButton.styleFrom(
                backgroundColor: Colors.green,
                padding:
                    const EdgeInsets.symmetric(horizontal: 40, vertical: 15),
                shape: RoundedRectangleBorder(
                    borderRadius: BorderRadius.circular(30)),
              ),
              child: const Text("Confirmar Agendamento",
                  style: TextStyle(color: Colors.white)),
            ),
          ],
        ),
      ),
    );
  }
}

// 🔹 Tela de Confirmação de Agendamento
class AppointmentConfirmationScreen extends StatelessWidget {
  final String doctor;
  final DateTime date;
  final TimeOfDay time;
  final double weight;
  final double height;
  final String doctorDescription; // Adicionando a descrição do médico

  const AppointmentConfirmationScreen({
    super.key,
    required this.doctor,
    required this.date,
    required this.time,
    required this.weight,
    required this.height,
    required this.doctorDescription, // Recebendo a descrição
  });

  double calculateIMC() {
    if (height <= 0) return 0.0;
    return weight / (height * height);
  }

  String getIMCMessage(double imc) {
    if (imc < 18.5) {
      return 'Seu IMC está abaixo do peso.';
    } else if (imc >= 18.5 && imc < 25) {
      return 'Seu IMC está dentro da faixa saudável.';
    } else if (imc >= 25 && imc < 30) {
      return 'Seu IMC indica sobrepeso.';
    } else {
      String message = 'Seu IMC indica obesidade. Consulte um médico.';
      if (imc > 35) {
        message += ' (Você está gordo.)';
      }
      return message;
    }
  }

  @override
  Widget build(BuildContext context) {
    final imc = calculateIMC();
    final imcMessage = getIMCMessage(imc);

    return Scaffold(
      appBar: AppBar(title: const Text("Confirmação"), backgroundColor: Colors.green),
      body: Center(
        child: Padding(
          padding: const EdgeInsets.all(20.0),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              const Icon(Icons.check_circle_outline,
                  color: Colors.green, size: 100),
              const SizedBox(height: 20),
              Text(
                "Agendamento Confirmado!",
                style: GoogleFonts.poppins(
                    fontSize: 24, fontWeight: FontWeight.bold),
                textAlign: TextAlign.center,
              ),
              const SizedBox(height: 10),
              Text(
                "Seu agendamento com:",
                style: GoogleFonts.poppins(fontSize: 18),
                textAlign: TextAlign.center,
              ),
              Text(
                doctor,
                style: GoogleFonts.poppins(
                    fontSize: 20, fontWeight: FontWeight.w500),
                textAlign: TextAlign.center,
              ),
              const SizedBox(height: 5),
              Text(
                doctorDescription, // Exibindo a descrição do médico
                style: GoogleFonts.poppins(fontSize: 14, color: Colors.grey[600]),
                textAlign: TextAlign.center,
              ),
              const SizedBox(height: 10),
              Text(
                "Para o dia:",
                style: GoogleFonts.poppins(fontSize: 18),
                textAlign: TextAlign.center,
              ),
              Text(
                "${date.day}/${date.month}/${date.year}",
                style: GoogleFonts.poppins(
                    fontSize: 20, fontWeight: FontWeight.w500),
                textAlign: TextAlign.center,
              ),
              const SizedBox(height: 10),
              Text(
                "Às:",
                style: GoogleFonts.poppins(fontSize: 18),
                textAlign: TextAlign.center,
              ),
              Text(
                time.format(context),
                style: GoogleFonts.poppins(
                    fontSize: 20, fontWeight: FontWeight.w500),
                textAlign: TextAlign.center,
              ),
              const SizedBox(height: 20),
              Text(
                "Seu IMC é: ${imc.toStringAsFixed(2)}",
                style: GoogleFonts.poppins(fontSize: 18, fontWeight: FontWeight.bold),
                textAlign: TextAlign.center,
              ),
              Text(
                imcMessage,
                style: GoogleFonts.poppins(fontSize: 16),
                textAlign: TextAlign.center,
              ),
              const SizedBox(height: 30),
              ElevatedButton(
                onPressed: () {
                  Navigator.popUntil(context, (route) => route.isFirst);
                },
                style: ElevatedButton.styleFrom(
                  backgroundColor: Colors.pink,
                  padding:
                      const EdgeInsets.symmetric(horizontal: 40, vertical: 15),
                  shape: RoundedRectangleBorder(
                      borderRadius: BorderRadius.circular(30)),
                ),
                child: const Text("Voltar para a Tela Inicial",
                    style: TextStyle(color: Colors.white)),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
Editor is loading...
Leave a Comment