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

Navegación nativa

Render native navbars, tabbars, and transition shells over a full-screen Capacitor WebView

Demostración

Demos de WebP animados

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

Activos de origen
Demostración de caja de navegación nativa animada que muestra navbar nativa, pestañas y contenido de WebView
Caja de navegación nativa
Flujo de toque de navegación nativa animada que muestra la selección de pestañas, la transición de empuje y el botón de regreso nativo
Flujo de toque
Demo animada de iconos SVG nativos 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 notificación y transiciones de zoom
Opciones de estilo

Guía

Tutorial de Navegación Nativa

Probar en dispositivo

Descargue la aplicación Capgo, luego escane la cámara QR code.

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

Usando @capgo/capacitor-native-navigation

@capgo/capacitor-native-navigation Rendice navegación nativa superior, barra de tabs inferior, y cápsulas de transición de ruta sobre una sola pantalla completa Capacitor WebView. Su marco de framework web sigue teniendo rutas y contenido, mientras que la nativa se encarga del marco de la aplicación.

Instalar y sincronizar

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

Configurar el marco nativo

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 sigue realizando 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}`);
});

Cambia la animación de las rutas

Usa una transacción de transición alrededor de la 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

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

Añade contenido con ajustes nativos

Cuando contentInsetMode es css, 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 iconos

Los iconos son descripciones nativas, no nodos de React o Vue. Usa SVG cuando no quieras 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 rectque cubre conjuntos de iconos comunes como Lucide y Feather.

Combine con @capgo/capacitor-transiciones

Utilice la navegación nativa para el menú de navegación nativa, la barra de herramientas, los ajustes de área segura y los eventos de intención nativa. Utilice @capgo/capacitor-transitions para la pila de página 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>

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

Sigue adelante desde el uso de @capgo/capacitor-native-navigation

Si estás utilizando Usando @capgo/capacitor-native-navigation Para planificar el comportamiento de medios y interfaz nativa, conecta con @capgo/capacitor-native-navigation para los detalles de implementación en @capgo/capacitor-native-navigation Iniciar para los detalles de implementación en Iniciar Usando @capgo/capacitor-live-activities para la capacidad nativa en Usando @capgo/capacitor-live-activities @capgo/capacitor-live-activities para los detalles de implementación en @capgo/capacitor-actividades-en-vivo, y Usando @capgo/capacitor-reproductor-de-videos para la capacidad nativa en Usando @capgo/capacitor-reproductor-de-videos.