Aitor Sánchez - Blog - Oct. 27, 2023, 11:50 a.m.
¿Buscando información sobre NavController, o navigation, del framework Ionic? O, quizás, lo que quieres es saber cómo podemos navegar entre las páginas de nuestra aplicación ¿verdad?
Mi nombre es Aitor Sánchez, soy desarrollador de apps desde el año 2014, y cuando termines con este artículo sabrás navegar entre las páginas de tu aplicación Ionic igual que el capitán Jack Sparrow surca los mares a los mando de la Perla Negra.
Pero antes de continuar, esta es la Flutter Mafia. Es mi newsletter donde aprenderás desarrollo de apps móviles, aso y monetización junto con otros genietes que ya están dentro. Y si te suscribes te regalo mi ebook "Duplica los ingreso de tus apps en 5 minutos" No es broma, quizás te interese.
Ahora vamos a ver un ejemplo de código muy sencillo en el que observamos un uso básico, pero funcional, de este módulo, que, por cierto, pertenece al paquete “@angular/core”.
import { NavController } from 'ionic-angular';
class MyComponent {
constructor(public navCtrl: NavController) {
}
}
En primer lugar, necesitamos realizar una importación del módulo NavController en la clase donde lo vayamos a usar.
Posteriormente, y como en la mayoría de los componentes, necesitamos realizar una inyección en el constructor para poder utilizarlo.
Y listo, ya tenemos todo preparado para empezar a utilízalo.
Nota: El trasfondo del componente es, en pocas palabras, un array que almacena el uso de la aplicación para poder controlar si avanzando o si volvemos atrás sobre el Navigation. Lo mete todo en una pila y va añadiendo o quitando páginas a nuestra voluntad. Ya sean páginas, como tal, o tabs. Es el mismo componente que el navcontroller de Angular, por si lo has utilizado alguna vez.
En el punto anterior hemos visto cómo se configura el módulo, ahora vamos a ver como lo podemos usar.
Primero hay que explicar que existen 2 tipo de datos dentro del array que hemos explicado más arriba. Uno es el Root Page y otro son el resto de las ventanas agregadas. Definiendo Root Page como la página principal o primaria.
Bien, ahora tendremos que fijarnos muy bien la etiqueta ion-nav. Esta etiqueta será la más importante del siguiente ejemplo:
import { Component, ViewChild } from '@angular/core';
import { NavController } from 'ionic-angular';
@Component({
template: '<ion-nav #myNav [root]="rootPage"></ion-nav>'
})
export class MyApp {
@ViewChild('myNav') nav: NavController
public rootPage: any = TabsPage;
// Wait for the components in MyApp's template to be initialized
// In this case, we are waiting for the Nav with reference variable of "#myNav"
ngOnInit() {
// Let's navigate from TabsPage to Page1
this.nav.push(Page1);
}
}
Otra cosa importante, fíjate bien cómo accedemos al navctrl. Lo referenciamos en nuestro código TS mediante el decorador @ViewChild.
Una vez que abrimos la app por primera vez, el mismo sistema nos pone por defecto en el Root Page la primera página de la aplicación. Siempre y cuando no lo hayamos configurado de otra manera de forma explícita.
En el código vemos cómo podemos hacer un push de otra página sobre la página principal. De esta manera logramos que el usuario vea otra página y esta, la que estamos pusheando, se meta dentro del array de páginas que lleva el sistema navController.
En caso de que pulsemos sobre el botón “atrás” o le digamos explícitamente, ves hacia atrás, que lo veremos más abajo, esta página será eliminada de la cola, y volveremos a la página anterior. En este caso concreto, la Root Page.
Nota: Si no sabes lo que es la página raíz, será la página que está en la posición 0 del stack. La página que una vez en ella al pulsar sobre el botón "back" se saldrá de la aplicación.
Por otro lado, y como era de esperar, se puede cambiar la Root Page de la app. Para que, en el siguiente cambio de ventana, esta pase a ser la principal. Recuerda que esta función elimina toda la cola anterior y pone esta página, la que le vamos a pasar, como principal.
setRoot(newRootPage){
this.nav.setRoot(newRootPage);
}
Como vemos en el ejemplo (este es muy sencillo), llamamos a la función setRoot del navController y le pasamos la nueva ventana. A partir de ahora toda la pila comenzará a partir de ahí.
Aunque antes hemos visto un poco como se realiza este paso, vamos a especificar y ahondar un poquito más sobre esta funcionalidad.
import { Component } from '@angular/core';
import { NavController } from 'ionic-angular';
@Component({
template: `
<ion-header>
<ion-navbar>
<ion-title>Other Page</ion-title>
</ion-navbar>
</ion-header>
<ion-content>I'm the other page!</ion-content>`
})
class OtherPage {
constructor(public navCtrl: NavController ){
}
popView(){
this.navCtrl.pop();
}
}
La verdad que es algo sencillo. Con el método “pop()” hacemos que el stack retroceda en un espacio. La lógica es la misma que cuando pulsamos sobre el botón “back” del dispositivo. Es más, por debajo, al pulsar “back” se ejecuta el mismo código, a excepción de que hayamos sobrescrito la lógica de este.
Ahora vamos a pasar a comentar el ciclo de vida de una vista, y los eventos que se ejecutan. Eventos que podemos sobrescribir para darles la funcionalidad que nosotros queramos.
En determinadas ocasiones, se nos plantea el problema de que tenemos que controlar cuando un usuario entra o sale de una determinada página/ventana. Hemos visto los métodos antes, los dos últimos, ionViewCanEnter y ionViewCanLeave. Solo tendremos que sobrescribirlos y ya podremos tomar acción sobre lo que hace el usuario dentro de la pantalla.
Ahora veamos un ejemplo que se aprecia mucho mejor.
export class MyClass{
constructor(
public navCtrl: NavController
){}
pushPage(){
this.navCtrl.push(DetailPage);
}
ionViewCanLeave(): boolean{
// here we can either return true or false
// depending on if we want to leave this view
if(isValid(randomValue)){
return true;
} else {
return false;
}
}
}
Los métodos de NavController que nos permite cambiar de página pueden recibir unos parámetros con los que podemos cambiar el comportamiento de esta.
El router de Angular tiene un método llamado LocationStrategy.historyGo que permite a los desarrolladores moverse al forward y al backward mediante el histórico de ventanas de la aplicación. Veamos un ejemplo que lo entenderás mejor.
Digamos que tenemos el siguiente histórico de navegación:
/pageA
--> /pageB
--> /pageC
Si llamas a "LocationStrategy.historyGo(-2) desde la página "/pageC", volverias a la página "/pageA". Si después lo usamos así: "LocationStrategy.historyGo(2), volveremos a la página "/pageC".
A parte, esta clase tiene campos y métodos para conocer más detalles sobre el histórico de navegación que te invito a que revises por tu cuenta.
Lo último a comentar aquí, es que si la aplicación no hace una carga lineal de la navegación, es aconsejable que montes un servicio que te permita saber dónde está el usuario en todo momento y las página por las que ha pasado.
Como ya tenemos una idea bastante amplia de lo que es el NavController y el Navigation y de cómo podemos usarlo, vamos a ver de manera más avanzada lo que podemos hacer con ella. Mediante sus funciones y campos de clase.
Esta función nos permite comprobar si podemos usar “NavController.pop()” o el botón de retroceder sin que la aplicación se cierre. También nos permite conocer si estamos sobre la Root Page.
Lo mismo que la función anterior, pero en caso de usar el botón “back” es para comprobar si podemos hacer “swipe back”.
Retorna la primera vista que está en el Stack del navController / Navigation
Retorna la página activa en el stack de navController
Retorna el ítem que está activo de la navegación. Por Ejemplo: Si tenemos un menú que tiene “fruta”, “verdura” y “carne” y actualmente estamos viendo “verdura” esta función devolverá el controlador de “verdura”.
Similar al anterior, pero con retorno múltiple.
Esta función nos permite conocer todas las opciones que tenemos disponibles en la navegación.
Esta función nos devuelve, sobre la pila de páginas, la que nosotros le especifiquemos por parámetro.
Retorna la vista anterior a la que le especifiquemos por parámetros.
Retorna todo el stack de páginas que tenemos agendadas en el “navController”.
Esta función nos permite conocer la posición, dentro del índice del stack, de una vista en el Navigation.
Esta función nos permite meter una página dentro del Stack del navController.
Nos permite conocer si la vista en cuestión está activa.
Nos permite conocer si la vista actual está en fase de transición o no.
Retorna la última página en el Stack de páginas del NavController.
Retorna el número de vistas que hay en el Stack del navController.
Este campo contiene el padre de la vista que está activa en la actualidad. En caso de que sea el Root Page, parent es igual a null.
Esta función nos permite navegar a la página anterior del stack del navController.
Similar a la anterior, pero en lugar de llevarnos una página atrás, nos llevará hasta el RootPage.
Esta función, como ya hemos visto en ejemplos anteriores, nos permite meter una vista dentro del Stack. Los params serán accesibles desde la clase “NavParams” en la clase objetivo.
Como su propio nombre indica, nos permite eliminar páginas del Stack del navController. Desde un índice dado hasta la cantidad de páginas que queremos eliminar.
Elimina la página en cuestión del Stack del Navigation.
Con esta función podemos agregar vistas al stack de navegación a continuación de la última vista que esté agregada. Por defecto, las opciones de transición estarán desactivadas, pero ahora veremos cómo las podemos activar.
Con esta función lo que logramos es definir un nuevo Root Page al sistema eliminando así todo el Stack anterior del Navigation.
Mira, la manera más sencilla de aumentar tus instalaciones, y por extensión el dinero que ganas, de tu aplicación es mejorando el logo. Optimizando, cuidando y mimándolo, es de las cosas que más resultados ofrece en tu ASO. Por eso hemos creado una herramienta para ayudarte con esto. Aquí la tienes, no te espoileo más.
Ahora solo queda despedirme y decir que, gracias por estar ahí, como siempre y que nos vemos en el siguiente artículo… Hasta entonces, ¡que vaya bien!