Tutorial de Ionic – Crear una aplicaci贸n para guardar nuestros sitios geolocalizados – Parte 6 – Mostrar detalles del sitio guardado y abrir navegador gps para llegar a el.

En el siguiente enlace tienes el 铆ndice para acceder al resto de entradas de este tutorial:

 

隆隆Atenci贸n!! este tutorial se basa en ionic 3 y est谩 desactualizado por lo que es posible que los ejemplos no funcionen en la 煤ltima versi贸n de ionic, haz click aqu铆 para acceder a un tutorial mas actual de Ionic.

Hola a todos, en el post anterior聽vimos como guardar nuestros sitios en la base de datos y como mostrar los sitios que tenemos guardados en la p谩gina listado.

Hoy vamos a mostrar el detalle del sitio聽al pulsar sobre el en el listado. La idea es que nos muestre la direcci贸n, la foto y la descripci贸n que hayamos introducido, adem谩s vamos a a帽adir un bot贸n de “Como llegar” para que nos abra el navegador gps del m贸vil con la direcci贸n hac铆a dicho sitio. Ya no volveremos a olvidar donde hemos aparcado el coche, o podremos recordar como volver a ese restaurante que tanto nos gust贸.

Lo primero que tenemos que hacer es crear un nuevo modal con ionic generator:

ionic g page modalDetalleSitio

Ahora en listado.ts debemos importar el componente聽ModalController聽 de la librer铆a ionic-angular, por lo tanto despu茅s de NavController y NavParams importamos tambi茅n ModalController.

import { IonicPage, NavController, NavParams, ModalController } from 'ionic-angular';

Debemos inyectar tambi茅n en el constructor el componente ModalController al que hemos llamado modalCtrl:

constructor(
    public navCtrl: NavController,
    public navParams: NavParams,
    public modalCtrl : ModalController,
    public db: DbProvider) { ......

Ahora ya podemos crear un m茅todo en listado.ts聽para abrir el modal que acabamos de crear pasandole como par谩metro el sitio que queremos mostrar:

muestraSitio(sitio){
      let modalSitio = this.modalCtrl.create( 'ModalDetalleSitioPage', sitio );
      modalSitio.present();
   }

Vamos a modificar el listado para que al pulsar sobre un sitio de la lista se abra el modal por lo tanto editamos listado.html y a帽adimos lo siguiente:

<!--
聽聽Generated template for the Listado page.

聽聽See http://ionicframework.com/docs/components/#navigation for more info on
聽聽Ionic pages and navigation.
-->
<ion-header>

  <ion-navbar>
    <ion-title>Listado</ion-title>
  </ion-navbar>

</ion-header>


<ion-content padding>
<ion-list>
  <ion-item *ngFor="let sitio of sitios" (click)="muestraSitio(sitio)">
    <ion-thumbnail item-left>
      <img [src]="sitio.foto">
    </ion-thumbnail>
    <h2>{{ sitio.address }}</h2>
    <p>{{ sitio.description }}</p>
  </ion-item>
</ion-list>
</ion-content>

Con esto llamamos al m茅todo muestraSitio que acabamos de definir en el controlador listado.ts聽y le pasamos como par谩metro el sitio sobre el se ha hecho click.

Ahora vamos a editar el archivo modal-detalle-sitio.ts聽y vamos a importar e inyectar en en constructor el elemento聽ViewController聽que lo utilizaremos para poder cerrar el modal:

import { Component } from '@angular/core';
import { IonicPage, NavController, NavParams, ViewController } from 'ionic-angular';

/**
聽* Generated class for the ModalDetalleSitio page.
聽*
聽* See http://ionicframework.com/docs/components/#navigation for more info
聽* on Ionic pages and navigation.
*/

@IonicPage()
@Component({
  selector: 'page-modal-detalle-sitio',
  templateUrl: 'modal-detalle-sitio.html',
})
export class ModalDetalleSitioPage {

  constructor(public navCtrl: NavController, public navParams: NavParams, private viewCtrl : ViewController) {
}

...

Vamos a crear tambi茅n una funci贸n para cerrar el modal a la que luego llamaremos desde el bot贸n de cerrar de la vista:

cerrarModal(){
    this.viewCtrl.dismiss();
  }

Ahora vamos a crear una variable miembro llamada sitio donde vamos a guardar el objeto con los datos del sitio que recibimos desde NavParams como par谩metro al abrir el modal desde la p谩gina listado:

...
export class ModalDetalleSitioPage {

聽聽sitio: any;
  constructor(public navCtrl: NavController, public navParams: NavParams, private viewCtrl : ViewController) {
      this.sitio = this.navParams.data;
}

...

Ahora ya estamos listos para poder mostrar los datos del sitio el la vista, as铆 que editamos el archivo聽modal-detalle-sitio.html聽e introducimos el siguiente c贸digo:

<!--
聽聽Generated template for the ModalDetalleSitio page.

聽聽See http://ionicframework.com/docs/components/#navigation for more info on
聽聽Ionic pages and navigation.
-->
<ion-header>

  <ion-navbar>
    <ion-title>{{ sitio.address }}</ion-title>
     <ion-buttons start>
      <button ion-button (click)="cerrarModal()">
        <ion-icon name="md-close"></ion-icon>
      </button>
    </ion-buttons>
  </ion-navbar>

</ion-header>


<ion-content padding>
  <ion-card>
    <img [src]="sitio.foto" *ngIf="sitio.foto" />
    <ion-card-content>
       <ion-item text-wrap>
          <h2>{{ sitio.address }}</h2>
           <p>{{ sitio.description }}</p>
        </ion-item>
    </ion-card-content>
    <ion-row>
      <ion-col text-center>
         <button ion-button icon-left clear small (click)="comoLlegar()">
           <ion-icon name="navigate"></ion-icon>
           <div>Como llegar</div>
         </button>
      </ion-col>
    </ion-row>
</ion-card>
</ion-content>

Como t铆tulo del modal hemos puesto la direcci贸n que est谩 almacenada en sitio.address.

Despu茅s a帽adimos el bot贸n para cerrar el modal, para ello le indicamos que en el evento click llame a la funci贸n cerrarModal que hemos definido en el controlador.

Despu茅s dentro de ion-content 聽creamos un elemento ion-card y dentromostramos la foto solo si existe con el condicional *ngIf.

Despu茅s dentro de ion-card-content 聽mostramos la direcci贸n y la descripci贸n.

Por 煤ltimo creamos un bot贸n con un icono de tipo navigate dentro de un elemento ion-col que a su vez esta dentro de un elemento ion-row. Hacemos esto para conseguir que el bot贸n se muestre centrado gracias a la propiedad text-center que hemos a帽adido a la etiqueta ion-col.

Para saber m谩s sobre los componentes disponibles en ionic pod茅is una vez m谩s leer la documentaci贸n oficial de ionic:聽https://ionicframework.com/docs/components/

Como podemos observar en el evento click del bot贸n llamamos a la funci贸n comoLlegar().

La idea es que cuando pulsemos en el bot贸n nos habr谩 el navegador gps que tengamos instalado por defecto en el m贸vil para indicarnos la ruta a seguir para llegar al lugar.

Vamos 聽ello vamos a crear la funci贸n comoLlegar en el controlador.

Aunque podr铆amos utilizar la funci贸n聽que ya expliqu茅 en est茅 post perteneciente a la serie de posts que publiqu茅 hace tiempo sobre google maps, vamos a utilizar en su lugar el plugin LaunchNavigator que ya nos ofrece esta funcionalidad de forma nativa (gracias a聽writ3r聽por el aporte).

Lo primero que debemos hacer es instalar el plugin escribiendo los siguientes comandos desde consola:

ionic cordova plugin add uk.co.workingedge.phonegap.plugin.launchnavigator
npm install --save @ionic-native/launch-navigator

Ahora debemos importar y declarar el plugin en app.module.ts:

import { BrowserModule } from '@angular/platform-browser';
import { ErrorHandler, NgModule } from '@angular/core';
import { IonicApp, IonicErrorHandler, IonicModule } from 'ionic-angular';
import { SplashScreen } from '@ionic-native/splash-screen';
import { StatusBar } from '@ionic-native/status-bar';

import { MyApp } from './app.component';

import { Geolocation } from '@ionic-native/geolocation';
import { Camera } from '@ionic-native/camera';
import { DbProvider } from '../providers/db/db';
import { SQLite } from '@ionic-native/sqlite';
import { LaunchNavigator } from '@ionic-native/launch-navigator';

@NgModule({
  declarations: [
    MyApp
  ],
  imports: [
    BrowserModule,
    IonicModule.forRoot(MyApp)
  ],
  bootstrap: [IonicApp],
  entryComponents: [
    MyApp
  ],
  providers: [
    StatusBar,
    SplashScreen,
    {provide: ErrorHandler, useClass: IonicErrorHandler},
    Geolocation,
    Camera,
    DbProvider,
    SQLite,
    LaunchNavigator

  ]
})
export class AppModule {}

Ahora editamos 聽el archivo modal-detalle-sitio.ts, importamos el plugin LauchNavigator, lo inyectamos en el constructor 聽y a帽adimos el m茅todo comoLlegar:

import { Component } from '@angular/core';
import { IonicPage, NavController, NavParams, ViewController } from 'ionic-angular';
import { LaunchNavigator } from '@ionic-native/launch-navigator';

/**
聽* Generated class for the ModalDetalleSitioPage page.
聽*
聽* See http://ionicframework.com/docs/components/#navigation for more info
聽* on Ionic pages and navigation.
*/
@IonicPage()
@Component({
  selector: 'page-modal-detalle-sitio',
  templateUrl: 'modal-detalle-sitio.html',
})
export class ModalDetalleSitioPage {

  sitio: any;

  constructor(public navCtrl: NavController, public navParams: NavParams, private viewCtrl : ViewController, private launchNavigator : LaunchNavigator) {
     this.sitio = this.navParams.data;
  }

  ionViewDidLoad() {
    console.log('ionViewDidLoad ModalDetalleSitioPage');
  }

  cerrarModal(){
    this.viewCtrl.dismiss();
  }

  comoLlegar(){
    let destino = this.sitio.lat+', '+this.sitio.lng;
    this.launchNavigator.navigate(destino)
    .then(
      success => console.log('Launched navigator'),
      error => console.log('Error launching navigator', error)
    );

 }
}

El m茅todo navigate de launchNavigator recibe como par谩metro la direcci贸n donde queremos llegar, en este caso las coordenadas separadas por una coma que tenemos en las variables this.sitio.lat y this.sitio.lng.

Si ejecutamos nuestra aplicaci贸n en en m贸vil obtendremos algo como esto al entrar en el detalle de un sitio de la lista:

Modal detalle del sitio
Modal detalle del sitio

Bien , por hoy lo dejamos aqu铆, ya podemos guardar nuestros sitios favoritos, o recordar donde hemos aparcado el coche por ejemplo, podemos mostrar los sitios que hemos guardado y podemos abrir el navegador gps para poder llegar asta el lugar.

Aunque se puede mejorar mucho esta aplicaci贸n, ya podemos decir que es funcional y nos ha servido para aprender muchos conceptos sobre ionic. Como siempre os animo a que experiment茅is y trat茅is de mejorar la app por vuestra cuenta ya que es una magnifica forma de aprender y mejorar.

En el pr贸ximo post聽seguiremos desarrollando la app y veremos como modificar un sitio guardado.

 

Si necesitas desarrollar una aplicaci贸n m贸vil no dudes en solicitarme un presupuesto sin compromiso:

Un saludo, y si a煤n no lo has hecho no olvides suscribirte a mi blog para no perderte los pr贸ximos posts 聽:-),

Tambi茅n puedes seguirme en Twitter en 鈥嶡revigames y no olvides que me ayudas mucho聽si compartes este post en las redes sociales.

15 comentarios en “Tutorial de Ionic – Crear una aplicaci贸n para guardar nuestros sitios geolocalizados – Parte 6 – Mostrar detalles del sitio guardado y abrir navegador gps para llegar a el.

  1. Muy buen tutorial!!! felicitaciones al creador
    tengo un problema, cuando quiero ver el detalle, la ventana modal no se visualiza, pero est谩 creada porque toda la interfaz queda bloqueada. Incluso cuando apreto el boton back del celular veo que la ventana modal se cierra (aparece un segundo cuadno se est谩 cerrando).
    alguna idea de qu茅 puede estar pasando???
    muchas gracias

    1. Hola excelente tutorial, muchas gracias por tomarte el tiempo y compartir tu conocimiento con el mundo.

      Me pasaba lo mismo que a Nicolas, dure un par de horas buscando la soluci贸n y por fin la encontr茅.

      El problema esta en el constructor de modal-detalle-sitio.ts, cuando pedimos el sitio que pasamos por par谩metro a el NavParams nos esta devolviendo undefined.

      this.sitio = this.navParams.get(‘miSitio’); <— Error, esto hace que cuando se intenta hacer el binding en el modal-detalle-sitio.html no lo pueda resolver y por eso no aparece correctamente pagina.

      Lo solucion茅 de la siguiente manera:

      this.sitio = this.navParams.data;

      Espero les sirva este aporte.

      y repito excelente tutorial, muchas gracias…

      1. 隆Muchas gr谩cias Luis!, no hab铆a tenido tiempo de revisarlo hasta ahora, por lo visto con la 煤ltima versi贸n algunos cosas han cambiado. Gr谩cias por el aporte, ya lo he cambiado.

  2. Hola Eduardo, en primer lugar darte las gracias y la enhorabuena por el tutorial, estoy aprendiendo much铆simo con 茅l.
    Quer铆a realizar un aporte, que creo que queda mucho m谩s claro y f谩cil de entender con la funci贸n comoLlegar, y es que importando el plugin LaunchNavigator la funci贸n quedar铆a as铆:

    comoLlegarAlt(){

    let destino = this.sitio.lat+’, ‘+this.sitio.lng;

    this.launchNavigator.navigate(destino)
    .then(
    success => console.log(‘Launched navigator’),
    error => console.log(‘Error launching navigator’, error)
    );
    }

    Adem谩s tiene una ampl铆a configuraci贸n de par谩metros, cargando el LaunchNavigatorOptions tambi茅n. Aunque la pega es que creo que no tiene soporte para windows phone.
    Enlace : https://ionicframework.com/docs/native/launch-navigator/

  3. hola buenas tardes , primeramente felicitar y agradecer los tutoriales que ha hecho el administrador , muy buenos y muy bien explicados, solo tengo un problema a la hora de usar el laucherNavigate , a la hora que ejecuto el boton como llegar no se acciona nada nisiqiera me manda el arror y ya me fije que al accionarse tuviera el nombre del metodo correcto y ada y quisiera ver que es . Ya me fije bien paso por paso pero nose que pasa, agradecer铆a mucho una aportacion , gracias

    1. Hola, a mi me sucede lo mismo, pr谩cticamente se cuelga la aplicaci贸n y no permite ni ir para atr谩s ni nada, encontraste la soluci贸n?
      Saludos

      1. No amigo desafortunadamente no, ya busque por internet y la verdad nose, practicamente el modal se congela una vez que el metodo comoLlegar se activa o el boton pues, si lo hayo la soluci贸n con mucho gusto la pondr茅 aqui , en tal caso tu la hayas agradeceria lo comentaras por que ya llevo d铆as con esto y nada jajaja

  4. Una pregunta @Eduardo sevilla , quisiera ver si me podrias ayudar en este problema, la app ya me habia funcionado en mi cel pero de un momento aca la pantalla de inicio de pone en blanco y asi se queda , nose si sea por que actualice ionic CLI o nose , pero por que sucede este problema? agradecer铆a el aporte

    en el ionic serve me sale esto :
    Runtime Error
    Uncaught (in promise): TypeError: Cannot read property ‘executeSql’ of null TypeError: Cannot read property ‘executeSql’ of null at DbProvider.CreateTableSitios (http://localhost:8100/build/main.js:52993:23) at http://localhost:8100/build/main.js:119348:53 at t.invoke (http://localhost:8100/build/polyfills.js:3:8971) at Object.onInvoke

    pero debe de ser por que debe correr en el celular

    aqui estan los archivos que relacionan esa parte

    https://gist.github.com/anonymous/6ff4f86aec1debeaa86fee494f30fd88

Deja una respuesta

Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *

Este sitio usa Akismet para reducir el spam. Aprende c贸mo se procesan los datos de tus comentarios.