Saltar al contenido principal
Volver a plugins
@capgo/capacitor-navegación nativa
Tutoriales
@capgo/capacitor-navegación nativa

Navegación nativa

Renderece barras de navegación, pestañas y cápsulas de transición sobre una pantalla completa de Capacitor WebView

Demostración

Demos de navegación web animada con WebP

Opciones de navegación nativa, selección de pestañas, iconos SVG y estilos renderizados como demos de WebP animadas.

Recursos de origen
Demo de navegación nativa animada que muestra un menú de navegación nativa, pestañas y contenido de WebView
Navegación nativa
Demo de flujo de navegación nativa animada que muestra la selección de pestañas, transición de empuje y botón de atrás nativo
Flujo de toque
Demo de icono SVG nativo animado que muestra iconos SVG inline, tinte nativo, etiquetas y selección de pestañas
Iconos SVG
Demo de opciones de navegación nativa animada que muestra colores dinámicos, etiquetas seleccionadas, etiquetas de advertencia y transiciones de zoom
Opciones de estilo

Guía

Tutoría de Navegación Nativa

Probar en dispositivo

Descargar la aplicación Capgo, luego escanea el código QR code.

Enlace de vista previa del plugin de navegación nativa QR code

Usando @capgo/capacitor-native-navigation

@capgo/capacitor-native-navigation Rendice una navegación nativa superior, barra de tabs inferior, y cápsulas de transición de ruta sobre una pantalla completa de Capacitor WebView. Su framework web aún controla las rutas y el contenido, mientras que la nativa controla la estructura de la aplicación.

Instalar y sincronizar

npm install @capgo/capacitor-native-navigation
npx cap sync

Configurar la estructura nativa

import { NativeNavigation } from '@capgo/capacitor-native-navigation';

await NativeNavigation.configure({
  contentInsetMode: 'css',
  animationDuration: 360,
  colors: {
    tint: '#0f172a',
    inactiveTint: '#64748b',
  },
});

Renderizar una barra de navegación nativa

await NativeNavigation.setNavbar({
  title: 'Inbox',
  subtitle: 'Native chrome',
  transparent: true,
  backButton: { visible: false },
  rightItems: [
    {
      id: 'compose',
      title: 'Compose',
      icon: {
        svg: '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 20h9"/><path d="M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4Z"/></svg>',
      },
    },
  ],
});

Renderizar una barra de tabs nativa

await NativeNavigation.setTabbar({
  selectedId: 'inbox',
  labelVisibilityMode: 'selected',
  icons: true,
  colors: {
    dynamic: true,
    tint: '#0f172a',
    inactiveTint: '#64748b',
  },
  tabs: [
    {
      id: 'inbox',
      title: 'Inbox',
      icon: {
        svg: '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 4h16v16H4z"/><path d="m4 13 4 4h8l4-4"/></svg>',
      },
    },
    {
      id: 'search',
      title: 'Search',
      icon: {
        svg: '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="7"/><path d="m20 20-3-3"/></svg>',
      },
    },
  ],
});

Conectar eventos nativos a su router

Las barras nativas emiten intención. Su router aún realiza el cambio de ruta:

await NativeNavigation.addListener('navbarBack', () => {
  router.back();
});

await NativeNavigation.addListener('navbarItemTap', ({ id }) => {
  if (id === 'compose') router.push('/compose');
});

await NativeNavigation.addListener('tabSelect', ({ id }) => {
  router.push(`/${id}`);
});

Animar cambios de ruta

Utilice una transacción de transición alrededor de su actualización de ruta web normal:

const transition = await NativeNavigation.beginTransition({
  direction: 'forward',
});

router.push('/message/42');
await router.ready?.();

await NativeNavigation.setNavbar({
  title: 'Message',
  backButton: { visible: true, title: 'Inbox' },
});

await NativeNavigation.finishTransition({
  id: transition.id,
  direction: 'forward',
});

Agregar una transición de zoom

Utilice los ayudantes de zoom para rutas que se abren desde una tarjeta, un elemento de cuadrícula o una vista previa de medios.

import { beginZoomTransition, finishZoomTransition } from '@capgo/capacitor-native-navigation';

const card = document.querySelector('[data-message-card]');
if (card) {
  const transition = await beginZoomTransition(card, { cornerRadius: 18 });

  router.push('/message/42');
  await router.ready?.();

  await NativeNavigation.setNavbar({
    title: 'Message',
    backButton: { visible: true, title: 'Inbox' },
  });

  await finishZoomTransition(undefined, {
    id: transition.id,
    cornerRadius: 18,
  });
}

Amarillear el contenido con los recuadros nativos

Cuando contentInsetMode es css, el complemento escribe variables CSS para las barras nativas:

.page {
  padding-top: var(--cap-native-navigation-top);
  padding-bottom: var(--cap-native-navigation-bottom);
}

Opciones de iconos

Los iconos son descripciones nativas, no nodos de React o Vue. Utilice SVG cuando no desee empaquetar activos nativos:

const icon = {
  svg: '<svg viewBox="0 0 24 24"><path d="M3 10.5 12 3l9 7.5"/></svg>',
  template: true,
  ios: { sfSymbol: 'house.fill' },
  android: { resource: 'ic_menu_view' },
};

El SVG en línea admite path, line, polyline, polygon, circle, y rect, que cubre conjuntos de iconos comunes como Lucide y Feather.

Combine con @capgo/capacitor-transiciones

Utilice la navegación nativa para el navbar nativo, tabbar, insets de área segura y eventos de intención nativa. Utilice @capgo/capacitor-transitions para la pila de páginas de WebView debajo de ese navegador nativo.

npm install @capgo/capacitor-native-navigation @capgo/capacitor-transitions
npx cap sync

Inicialice ambos paquetes una vez:

import { NativeNavigation } from '@capgo/capacitor-native-navigation';
import '@capgo/capacitor-transitions';
import { initTransitions, setupRouterOutlet, setDirection } from '@capgo/capacitor-transitions/react';

initTransitions({ platform: 'auto' });

const outlet = document.querySelector('cap-router-outlet');
if (outlet) {
  setupRouterOutlet(outlet, { platform: 'auto', swipeGesture: 'auto' });
}

await NativeNavigation.configure({
  contentInsetMode: 'css',
});

Conservar el enlace de transición enfocado en páginas, no barras web duplicadas:

<cap-router-outlet platform="auto" swipe-gesture="auto">
  <cap-page>
    <cap-content slot="content" fullscreen>
      <main class="page">Inbox content</main>
    </cap-content>
  </cap-page>
</cap-router-outlet>

Dirija ambos paquetes desde las mismas acciones de router:

async function openMessage(id: string) {
  setDirection('forward');
  await router.push(`/messages/${id}`);
  await NativeNavigation.setNavbar({
    title: 'Message',
    backButton: { visible: true, title: 'Inbox' },
  });
}

await NativeNavigation.addListener('navbarBack', () => {
  setDirection('back');
  router.back();
});

await NativeNavigation.addListener('tabSelect', ({ id }) => {
  setDirection('root');
  router.push(`/${id}`);
});

Elige una capa de animación por cambio de ruta. Deje @capgo/capacitor-transitions animar empujes de página normales, y utilice solo los ayudantes de zoom de la navegación nativa para rutas compartidas o de zoom.

Referencia Completa

Siga adelante desde Usando @capgo/capacitor-navegación-nativa

If you are using Usando @capgo/capacitor-native-navigation conectarlo con @capgo/capacitor-native-navigation para obtener más detalles en @capgo/capacitor-native-navigation, Getting Started para obtener más detalles en Getting Started, Usando @capgo/capacitor-live-activities para la capacidad nativa en Usando @capgo/capacitor-live-activities, @capgo/capacitor-live-activities para obtener más detalles en @capgo/capacitor-live-activities, y Usando @capgo/capacitor-video-player para la capacidad nativa en Usando @capgo/capacitor-reproductor de video.