Diferencia entre revisiones de «Flutter Navegación»

De MediaWiki
Ir a la navegación Ir a la búsqueda
Línea 16: Línea 16:
  
 
* Para ello voy a crear un nuevo StatelessWidget MiMaterialAppNavegar el cual va a visualizar una lista de opciones que cargarán diferentes pantallas.
 
* Para ello voy a crear un nuevo StatelessWidget MiMaterialAppNavegar el cual va a visualizar una lista de opciones que cargarán diferentes pantallas.
−
: También modificaré el AppBar para que aparezcan opciones de menú y que también se navege entre páginas al pulsar una de ellas.
+
: También modificaré el AppBar para que aparezcan opciones de menú y que también se navege entre páginas al pulsar una de ellas así como el uso de [https://material.io/components/bottom-navigation/android#using-bottom-navigation Button Navigation].
 +
: Para ello haré uso del snippet '''fscaffoldabbn''' el cual genera todo el código necesario.
 +
: También voy a crear dos páginas a las cuales vamos a navegar desde las diferentes opciones.
  
  
 +
[[Imagen:Flutter_dart_navegacion_1.JPG|300px|center]]
 +
 +
 +
 +
* La estructura de páginas será la siguiente:
 +
:* /lib/main.dart => Página que ejecuta el main y carga MiMaterialAppConNavegacion
 +
:* /lib/src/pages/app_con_navegación.dart  => Clase MiMaterialAppConNavegacion, que visualiza un ManterialApp y carga PrincipalNavegacionPage
 +
:* /lib/src/pages/stateful/navegando/principal_navegación_page.dart => Clase PrincipalNavegacionPage que visualiza una lista para navegar, un Appbar con dos opciones de menú para navegar y dos Navigation Button en la parte inferior para navegar.
 +
:* /lib/src/pages/stateful/navegando/pagina1_page.dart => Clase Pagina1NavegacionPage. Página con un contenido
 +
:* /lib/src/pages/stateful/navegando/pagina2_page.dart => Clase Pagina2NavegacionPage. Página con un contenido.
 +
 +
 +
 +
'''Archivo main.dart''':
 +
:<syntaxhighlight lang="java" enclose="div" highlight="">
 +
import 'package:flutter/material.dart';
 +
import 'package:holamundo/src/app.dart';
 +
import 'src/app_con_navegacion.dart';
 +
 +
void main() => runApp(MiMaterialAppConNavegacion());
 +
 +
</syntaxhighlight>
 +
 +
 +
 +
'''Archivo app_con_navegacion.dart''':
 +
:<syntaxhighlight lang="java" enclose="div" highlight="">
 +
import 'package:flutter/material.dart';
 +
import 'package:holamundo/src/pages/stateful/navegando/principal_navegacion_page.dart';
 +
 +
class MiMaterialAppConNavegacion extends StatelessWidget {
 +
  const MiMaterialAppConNavegacion({Key? key}) : super(key: key);
 +
 +
  @override
 +
  Widget build(BuildContext context) {
 +
    return MaterialApp(
 +
      home: PrincipalNavegacionPage(),
 +
      debugShowCheckedModeBanner: false,
 +
    );
 +
  }
 +
}
 +
 +
 +
</syntaxhighlight>
 +
 +
 +
 +
'''Archivo PrincipalNavegacionPage.dart''':
 +
:<syntaxhighlight lang="java" enclose="div" highlight="">
 +
import 'package:flutter/material.dart';
 +
import 'package:holamundo/src/pages/stateful/navegando/pagina1_page.dart';
 +
import 'package:holamundo/src/pages/stateful/navegando/pagina2_page.dart';
 +
 +
class PrincipalNavegacionPage extends StatefulWidget {
 +
  const PrincipalNavegacionPage({Key? key}) : super(key: key);
 +
 +
  @override
 +
  _PrincipalNavegacionPageState createState() => _PrincipalNavegacionPageState();
 +
}
 +
 +
class _PrincipalNavegacionPageState extends State<PrincipalNavegacionPage> {
 +
  int _index = 0; // TODO: make sure this is outside build(), otherwise every setState will change the value back to 0
 +
 +
  @override
 +
  Widget build(BuildContext context) {
 +
 +
    return Scaffold(
 +
 +
      appBar: AppBar(
 +
        title: Text('App con navegación'),
 +
        actions: [
 +
          IconButton(icon: Icon(Icons.av_timer),onPressed: (){},),
 +
          IconButton(icon: Icon(Icons.add),onPressed: (){},),
 +
 +
        ],
 +
      ),
 +
 +
      body: _pantallasCargar(),
 +
      bottomNavigationBar: BottomNavigationBar(
 +
        onTap: (tappedItemIndex) =>
 +
            setState(() {
 +
              _index = tappedItemIndex;
 +
            }),
 +
        currentIndex: _index,
 +
        items: [
 +
          BottomNavigationBarItem(
 +
              icon: Icon(Icons.av_timer), label: 'navBarItem1Text'),
 +
          BottomNavigationBarItem(
 +
              icon: Icon(Icons.add), label: 'navBarItem2Text')
 +
        ],
 +
      ),
 +
    );
 +
  }
 +
 +
  Widget _pantallasCargar(){
 +
 +
    return ListView(
 +
      children: [
 +
        ListTile(title: Text('Pantalla 1'), trailing: Icon(Icons.av_timer),
 +
                onTap: (){},),
 +
        ListTile(title: Text('Pantalla 2'), trailing: Icon(Icons.add),
 +
          onTap: (){},),
 +
      ],
 +
 +
    );
 +
 +
  }
 +
}
 +
 +
</syntaxhighlight>
 +
 +
 +
'''Archivo pagina1_page.dart''':
 +
:<syntaxhighlight lang="java" enclose="div" highlight="">
 +
import 'package:flutter/material.dart';
 +
 +
class Pagina1NavegacionPage extends StatelessWidget {
 +
  const Pagina1NavegacionPage({Key? key}) : super(key: key);
 +
 +
  @override
 +
  Widget build(BuildContext context) {
 +
    return Scaffold(
 +
        appBar: AppBar(
 +
          title: Text('Página 1'),
 +
        ),
 +
        body: null
 +
    );
 +
  }
 +
}
 +
 +
</syntaxhighlight>
 +
 +
 +
 +
'''Archivo pagina2_page.dart''':
 +
:<syntaxhighlight lang="java" enclose="div" highlight="">
 +
import 'package:flutter/material.dart';
 +
 +
class Pagina2NavegacionPage extends StatelessWidget {
 +
  const Pagina2NavegacionPage({Key? key}) : super(key: key);
 +
 +
  @override
 +
  Widget build(BuildContext context) {
 +
    return Scaffold(
 +
        appBar: AppBar(
 +
          title: Text('Página 2'),
 +
        ),
 +
        body: null
 +
    );
 +
  }
 +
}
 +
 +
</syntaxhighlight>
 +
 +
 +
 +
 +
'''Archivo main.dart''':
 +
:<syntaxhighlight lang="java" enclose="div" highlight="">
 +
</syntaxhighlight>
 
<br />
 
<br />
  

Revisión del 14:32 30 sep 2021

Intruducción

  • Más información en:


  • El objetivo de esta sección es aprender una forma de 'navegar' entre las diferentes pantallas que haya en una aplicación móbil, bien a través de opciones de menú, bien a través de un Widget al que controlemos un evento que provoque la carga de una nueva pantalla.


  • Para ello voy a crear un nuevo StatelessWidget MiMaterialAppNavegar el cual va a visualizar una lista de opciones que cargarán diferentes pantallas.
También modificaré el AppBar para que aparezcan opciones de menú y que también se navege entre páginas al pulsar una de ellas así como el uso de Button Navigation.
Para ello haré uso del snippet fscaffoldabbn el cual genera todo el código necesario.
También voy a crear dos páginas a las cuales vamos a navegar desde las diferentes opciones.


Flutter dart navegacion 1.JPG


  • La estructura de páginas será la siguiente:
  • /lib/main.dart => Página que ejecuta el main y carga MiMaterialAppConNavegacion
  • /lib/src/pages/app_con_navegación.dart => Clase MiMaterialAppConNavegacion, que visualiza un ManterialApp y carga PrincipalNavegacionPage
  • /lib/src/pages/stateful/navegando/principal_navegación_page.dart => Clase PrincipalNavegacionPage que visualiza una lista para navegar, un Appbar con dos opciones de menú para navegar y dos Navigation Button en la parte inferior para navegar.
  • /lib/src/pages/stateful/navegando/pagina1_page.dart => Clase Pagina1NavegacionPage. Página con un contenido
  • /lib/src/pages/stateful/navegando/pagina2_page.dart => Clase Pagina2NavegacionPage. Página con un contenido.


Archivo main.dart:

import 'package:flutter/material.dart';
import 'package:holamundo/src/app.dart';
import 'src/app_con_navegacion.dart';

void main() => runApp(MiMaterialAppConNavegacion());


Archivo app_con_navegacion.dart:

import 'package:flutter/material.dart';
import 'package:holamundo/src/pages/stateful/navegando/principal_navegacion_page.dart';

class MiMaterialAppConNavegacion extends StatelessWidget {
  const MiMaterialAppConNavegacion({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: PrincipalNavegacionPage(),
      debugShowCheckedModeBanner: false,
    );
  }
}


Archivo PrincipalNavegacionPage.dart:

import 'package:flutter/material.dart';
import 'package:holamundo/src/pages/stateful/navegando/pagina1_page.dart';
import 'package:holamundo/src/pages/stateful/navegando/pagina2_page.dart';

class PrincipalNavegacionPage extends StatefulWidget {
  const PrincipalNavegacionPage({Key? key}) : super(key: key);

  @override
  _PrincipalNavegacionPageState createState() => _PrincipalNavegacionPageState();
}

class _PrincipalNavegacionPageState extends State<PrincipalNavegacionPage> {
  int _index = 0; // TODO: make sure this is outside build(), otherwise every setState will change the value back to 0

  @override
  Widget build(BuildContext context) {

    return Scaffold(

      appBar: AppBar(
        title: Text('App con navegación'),
        actions: [
          IconButton(icon: Icon(Icons.av_timer),onPressed: (){},),
          IconButton(icon: Icon(Icons.add),onPressed: (){},),

        ],
      ),

      body: _pantallasCargar(),
      bottomNavigationBar: BottomNavigationBar(
        onTap: (tappedItemIndex) =>
            setState(() {
              _index = tappedItemIndex;
            }),
        currentIndex: _index,
        items: [
          BottomNavigationBarItem(
              icon: Icon(Icons.av_timer), label: 'navBarItem1Text'),
          BottomNavigationBarItem(
              icon: Icon(Icons.add), label: 'navBarItem2Text')
        ],
      ),
    );
  }

  Widget _pantallasCargar(){

    return ListView(
      children: [
        ListTile(title: Text('Pantalla 1'), trailing: Icon(Icons.av_timer),
                onTap: (){},),
        ListTile(title: Text('Pantalla 2'), trailing: Icon(Icons.add),
          onTap: (){},),
      ],

    );

  }
}


Archivo pagina1_page.dart:

import 'package:flutter/material.dart';

class Pagina1NavegacionPage extends StatelessWidget {
  const Pagina1NavegacionPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('Página 1'),
        ),
        body: null
    );
  }
}


Archivo pagina2_page.dart:

import 'package:flutter/material.dart';

class Pagina2NavegacionPage extends StatelessWidget {
  const Pagina2NavegacionPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('Página 2'),
        ),
        body: null
    );
  }
}



Archivo main.dart:








Enlace a la página principal de la UD5

Enlace a la página principal del curso




-- Ángel D. Fernández González -- (2021).