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

Navegación nativa

Renderizar barras de navegación, pestañas y conchas de transición sobre una pantalla completa de WebView Capacitor

Demo

Demos animados de WebP

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

Recursos de origen
Demo animado de shell de navegación nativa que muestra un menú de navegación nativa, pestañas y contenido de WebView
Shell nativa
Demo animado de flujo de navegación nativa que muestra la selección de pestañas, la transición de empuje y el botón de atrás nativo
Flujo de toque
Demo animado de iconos SVG nativos que muestra iconos SVG en línea, tonos nativos, etiquetas y selección de pestañas
Iconos SVG
Demo animada de opciones de navegación nativa que muestra colores dinámicos, etiquetas seleccionadas, badges y transiciones de zoom
Opciones de estilo

Guía

Tutorial sobre navegación nativa

Probar en dispositivo

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

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

Usando @capgo/capacitor-navegación-nativa

@capgo/capacitor-native-navigation Renderea navegación superior nativa, barra de tablas inferior y conchas de transición de ruta sobre una pantalla completa Capacitor WebView. Su marco de framework web sigue controlando las rutas y el contenido, mientras que la nativa controla la ventana de la aplicación.

Instale y sincronice

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

Configure el marco nativo

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

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

Renderizar un menú de navegación nativo

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 un tablero de navegación nativo

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>',
      },
    },
  ],
});

Conecta eventos nativos a tu router

Los barras nativas emiten intención. Tu 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

Utiliza una transacción de transición alrededor de tu 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

Utiliza los ayudantes de zoom para rutas que se abren desde una tarjeta, item de grid o 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,
  });
}

Ajustar el contenido con los rellenos nativos

Cuando contentInsetMode es csses, el plugin escribe variables CSS para las barras nativas:

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

Opciones de icono

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' },
};

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 Navegación Nativa para la barra de navegación nativa, la pestaña de tabbar, los ajustes de área segura y los 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',
});

Mantenga el outlet de transición enfocado en páginas, no duplique barras web:

<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>

Conduzca ambas 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}`);
});

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

Referencia Completa

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

Si está utilizando Usando @capgo/capacitor-navegación-nativa para planificar el comportamiento de medios y interfaz nativa, conecte @capgo/capacitor-navegación-nativa para el detalle de implementación en @capgo/capacitor-navegación nativa, Iniciación para el detalle de implementación en Iniciación, Usando @capgo/capacitor-actividades en vivo para la capacidad nativa en Usando @capgo/capacitor-actividades en vivo, @capgo/capacitor-actividades en vivo para el detalle de implementación en @capgo/capacitor-actividades en vivo, y Usando @capgo/capacitor-reproductor de video para la capacidad nativa en Usando @capgo/capacitor-reproductor de video.