feat: slide window logic

This commit is contained in:
imlildud
2026-05-22 18:24:53 -06:00
parent df7b74063b
commit bdde457b45
5 changed files with 260 additions and 178 deletions

View File

@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'src/views/rutas.dart';
import 'src/views/main_screen.dart'; // Importar la pantalla principal
void main() {
runApp(const MyApp());
@@ -13,6 +14,10 @@ class MyApp extends StatelessWidget {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Hackaton App',
theme: ThemeData(
fontFamily: 'Roboto',
scaffoldBackgroundColor: colorAzul,
),
home: const RegistroView(),
);
}
@@ -54,7 +59,11 @@ class RegistroView extends StatelessWidget {
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(15))
),
onPressed: () {
Navigator.push(context, MaterialPageRoute(builder: (context) => const HorariosView()));
// ✅ Navegar a la pantalla principal con todas las vistas
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => const MainScreen()),
);
},
child: const Text('Registrar', style: TextStyle(color: Colors.white, fontSize: 18)),
),
@@ -64,7 +73,14 @@ class RegistroView extends StatelessWidget {
padding: const EdgeInsets.symmetric(horizontal: 30, vertical: 15),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(15))
),
onPressed: () {},
onPressed: () {
// TODO: Implementar inicio de sesión
// Por ahora también navega a MainScreen
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => const MainScreen()),
);
},
child: const Text('Iniciar Sesion', style: TextStyle(color: Colors.white, fontSize: 18)),
),
],

View File

@@ -1,42 +1,41 @@
// configuracion.dart
import 'package:flutter/material.dart';
import 'nav_bar.dart';
import 'rutas.dart';
import 'domicilios.dart';
import 'horarios.dart';
class ConfiguracionView extends StatelessWidget {
const ConfiguracionView({super.key});
void _navigateTo(BuildContext context, int index) {
if (index == 2) return; // Ya estamos en Configuración
switch (index) {
case 0:
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => const DomiciliosView()),
);
break;
case 1:
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => const HorariosView()),
);
break;
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
appBar: AppBar(
backgroundColor: colorAzul,
title: const Text('Configuración',
style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold)),
centerTitle: true,
return Container(
color: Colors.white,
child: SafeArea(
child: Column(
children: [
// AppBar personalizado
Container(
width: double.infinity,
padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 16),
decoration: const BoxDecoration(
color: colorAzul,
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(20),
bottomRight: Radius.circular(20),
),
body: Padding(
),
child: const Text(
'Configuración',
style: TextStyle(
color: Colors.white,
fontSize: 28,
fontWeight: FontWeight.bold,
),
textAlign: TextAlign.center,
),
),
// Contenido
Expanded(
child: Padding(
padding: const EdgeInsets.all(20.0),
child: Column(
children: [
@@ -63,9 +62,9 @@ class ConfiguracionView extends StatelessWidget {
],
),
),
bottomNavigationBar: CustomNavBar(
currentIndex: 2,
onTap: (index) => _navigateTo(context, index),
),
],
),
),
);
}

View File

@@ -1,42 +1,41 @@
// domicilios.dart
import 'package:flutter/material.dart';
import 'nav_bar.dart';
import 'rutas.dart';
import 'horarios.dart';
import 'configuracion.dart';
class DomiciliosView extends StatelessWidget {
const DomiciliosView({super.key});
void _navigateTo(BuildContext context, int index) {
if (index == 0) return;
switch (index) {
case 1:
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => const HorariosView()),
);
break;
case 2:
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => const ConfiguracionView()),
);
break;
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
appBar: AppBar(
backgroundColor: colorAzul,
title: const Text('Domicilios',
style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold)),
centerTitle: true,
return Container(
color: Colors.white, // Fondo blanco para el contenido
child: SafeArea(
child: Column(
children: [
// AppBar personalizado
Container(
width: double.infinity,
padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 16),
decoration: const BoxDecoration(
color: colorAzul,
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(20),
bottomRight: Radius.circular(20),
),
body: Padding(
),
child: const Text(
'Domicilios',
style: TextStyle(
color: Colors.white,
fontSize: 28,
fontWeight: FontWeight.bold,
),
textAlign: TextAlign.center,
),
),
// Contenido
Expanded(
child: Padding(
padding: const EdgeInsets.all(20.0),
child: Column(
children: [
@@ -83,9 +82,9 @@ class DomiciliosView extends StatelessWidget {
],
),
),
bottomNavigationBar: CustomNavBar(
currentIndex: 0,
onTap: (index) => _navigateTo(context, index),
),
],
),
),
);
}

View File

@@ -1,31 +1,9 @@
import 'package:flutter/material.dart';
import 'nav_bar.dart';
import 'rutas.dart';
import 'domicilios.dart';
import 'configuracion.dart';
class HorariosView extends StatelessWidget {
const HorariosView({super.key});
void _navigateTo(BuildContext context, int index) {
if (index == 1) return; // Ya estamos en Horarios
switch (index) {
case 0:
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => const DomiciliosView()),
);
break;
case 2:
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => const ConfiguracionView()),
);
break;
}
}
@override
Widget build(BuildContext context) {
final List<Map<String, String>> rutas = List.generate(
@@ -37,15 +15,35 @@ class HorariosView extends StatelessWidget {
},
);
return Scaffold(
backgroundColor: Colors.white,
appBar: AppBar(
backgroundColor: colorAzul,
title: const Text('Horarios',
style: TextStyle(color: Colors.white, fontSize: 32, fontWeight: FontWeight.bold)),
centerTitle: true,
return Container(
color: Colors.white,
child: SafeArea(
child: Column(
children: [
// AppBar personalizado
Container(
width: double.infinity,
padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 16),
decoration: const BoxDecoration(
color: colorAzul,
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(20),
bottomRight: Radius.circular(20),
),
body: ListView.builder(
),
child: const Text(
'Horarios',
style: TextStyle(
color: Colors.white,
fontSize: 32,
fontWeight: FontWeight.bold,
),
textAlign: TextAlign.center,
),
),
// Lista de horarios
Expanded(
child: ListView.builder(
padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 24),
itemCount: rutas.length,
itemBuilder: (context, index) {
@@ -71,9 +69,9 @@ class HorariosView extends StatelessWidget {
);
},
),
bottomNavigationBar: CustomNavBar(
currentIndex: 1,
onTap: (index) => _navigateTo(context, index),
),
],
),
),
);
}

View File

@@ -0,0 +1,70 @@
import 'package:flutter/material.dart';
import 'rutas.dart';
import 'domicilios.dart';
import 'horarios.dart';
import 'configuracion.dart';
import 'nav_bar.dart';
class MainScreen extends StatefulWidget {
const MainScreen({super.key});
@override
State<MainScreen> createState() => _MainScreenState();
}
class _MainScreenState extends State<MainScreen> {
late PageController _pageController;
int _currentIndex = 1; // Comenzar en Horarios (Rutas)
@override
void initState() {
super.initState();
_pageController = PageController(initialPage: _currentIndex);
}
@override
void dispose() {
_pageController.dispose();
super.dispose();
}
void _onPageChanged(int index) {
setState(() {
_currentIndex = index;
});
}
void _onNavBarTap(int index) {
if (_currentIndex != index) {
setState(() {
_currentIndex = index;
});
_pageController.animateToPage(
index,
duration: const Duration(milliseconds: 300),
curve: Curves.easeInOut,
);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: colorAzul, // Mismo color de fondo para evitar flash blanco
body: PageView(
controller: _pageController,
onPageChanged: _onPageChanged,
physics: const BouncingScrollPhysics(), // Efecto de rebote al deslizar
children: const [
DomiciliosView(),
HorariosView(),
ConfiguracionView(),
],
),
bottomNavigationBar: CustomNavBar(
currentIndex: _currentIndex,
onTap: _onNavBarTap,
),
);
}
}