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 'package:flutter/material.dart';
import 'src/views/rutas.dart'; import 'src/views/rutas.dart';
import 'src/views/main_screen.dart'; // Importar la pantalla principal
void main() { void main() {
runApp(const MyApp()); runApp(const MyApp());
@@ -13,6 +14,10 @@ class MyApp extends StatelessWidget {
return MaterialApp( return MaterialApp(
debugShowCheckedModeBanner: false, debugShowCheckedModeBanner: false,
title: 'Hackaton App', title: 'Hackaton App',
theme: ThemeData(
fontFamily: 'Roboto',
scaffoldBackgroundColor: colorAzul,
),
home: const RegistroView(), home: const RegistroView(),
); );
} }
@@ -54,7 +59,11 @@ class RegistroView extends StatelessWidget {
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(15)) shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(15))
), ),
onPressed: () { 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)), 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), padding: const EdgeInsets.symmetric(horizontal: 30, vertical: 15),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(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)), 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 'package:flutter/material.dart';
import 'nav_bar.dart';
import 'rutas.dart'; import 'rutas.dart';
import 'domicilios.dart';
import 'horarios.dart';
class ConfiguracionView extends StatelessWidget { class ConfiguracionView extends StatelessWidget {
const ConfiguracionView({super.key}); 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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Container(
backgroundColor: Colors.white, color: Colors.white,
appBar: AppBar( child: SafeArea(
backgroundColor: colorAzul, child: Column(
title: const Text('Configuración', children: [
style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold)), // AppBar personalizado
centerTitle: true, 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), padding: const EdgeInsets.all(20.0),
child: Column( child: Column(
children: [ 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 'package:flutter/material.dart';
import 'nav_bar.dart';
import 'rutas.dart'; import 'rutas.dart';
import 'horarios.dart';
import 'configuracion.dart';
class DomiciliosView extends StatelessWidget { class DomiciliosView extends StatelessWidget {
const DomiciliosView({super.key}); 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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Container(
backgroundColor: Colors.white, color: Colors.white, // Fondo blanco para el contenido
appBar: AppBar( child: SafeArea(
backgroundColor: colorAzul, child: Column(
title: const Text('Domicilios', children: [
style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold)), // AppBar personalizado
centerTitle: true, 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), padding: const EdgeInsets.all(20.0),
child: Column( child: Column(
children: [ 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 'package:flutter/material.dart';
import 'nav_bar.dart';
import 'rutas.dart'; import 'rutas.dart';
import 'domicilios.dart';
import 'configuracion.dart';
class HorariosView extends StatelessWidget { class HorariosView extends StatelessWidget {
const HorariosView({super.key}); 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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final List<Map<String, String>> rutas = List.generate( final List<Map<String, String>> rutas = List.generate(
@@ -37,15 +15,35 @@ class HorariosView extends StatelessWidget {
}, },
); );
return Scaffold( return Container(
backgroundColor: Colors.white, color: Colors.white,
appBar: AppBar( child: SafeArea(
backgroundColor: colorAzul, child: Column(
title: const Text('Horarios', children: [
style: TextStyle(color: Colors.white, fontSize: 32, fontWeight: FontWeight.bold)), // AppBar personalizado
centerTitle: true, 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), padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 24),
itemCount: rutas.length, itemCount: rutas.length,
itemBuilder: (context, index) { 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,
),
);
}
}