Lompat ke konten utama
Kembali ke plugin
@capgo/capacitor-native-navigation
Tutorial
@capgo/capacitor-navigasi-nasional

Navigasi Nasional

Tampilkan navigasi nasional, tabbar, dan transisi shell di atas layar Capacitor WebView

Demo

Demos animasi WebP

Pengaturan Chrome, pilihan tab, ikon SVG, dan opsi gaya yang dirender sebagai demos animasi WebP.

Sumber aset
Demo shell navigasi native animasi menampilkan navbar native, tab, dan konten WebView
Shell native
Demo aliran sentuh navigasi native animasi menampilkan pilihan tab, transisi push, dan tombol kembali native
Aliran sentuh
Demo ikon SVG native animasi menampilkan ikon SVG inline, tinta native, label, dan pilihan tab
Ikon SVG
Demo opsi navigasi native animasi menampilkan warna dinamis, label terpilih, badge, dan transisi zoom
Opsi gaya

Petunjuk

Tutorial Pelayaran Asli

Uji coba pada perangkat

Unduh aplikasi Capgo, kemudian scan kode QR code.

Tautan QR pratinjau plugin Pelayaran Asli code

Menggunakan @capgo/capacitor-native-navigation

@capgo/capacitor-native-navigation menampilkan navigasi atas asli, tab bawah chrome, dan kulit transisi rute di atas layar skrin tunggal Capacitor WebView. Framework web Anda masih menguasai rute dan konten, sementara asli menguasai kerangka aplikasi.

Pasang dan sinkronkan

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

Konfigurasi frame asli

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

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

Tampilkan navbar asli

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

Tampilkan tabbar asli

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

Hubungkan acara asli ke router Anda

Barru asli mengeluarkan niat. Router Anda masih melakukan perubahan jalur:

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

Ubah perubahan jalur dengan animasi

Gunakan transaksi transisi di sekitar perubahan jalur web normal Anda:

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

Tambahkan transisi zoom

Gunakan bantuan zoom untuk jalur yang dibuka dari kartu, item grid, atau pratinjau media.

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

Tambahkan konten dengan insets asli

Ketika contentInsetMode adalah css, plugin ini menulis variabel CSS untuk bar-bar asli:

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

Pilihan ikon

Ikon adalah deskriptor asli, bukan node React atau Vue. Gunakan SVG ketika Anda tidak ingin menggabungkan aset asli:

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 Inline mendukung path, line, polyline, polygon, circle, dan rect, yang mencakup set ikon umum seperti Lucide dan Feather.

Combinasikan dengan @capgo/capacitor-transisi

Gunakan Navigasi Asli untuk navbar asli, tabbar, insets area aman, dan event intent asli. Gunakan @capgo/capacitor-transitions untuk stack halaman WebView di bawah chrome asli tersebut.

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

Inisialisasikan kedua paket sekali:

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

Tahan outlet transisi pada halaman, bukan duplikat bar 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>

Drive kedua paket dari aksi router yang sama:

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

Pilih satu layer animasi per perubahan route. Biarkan @capgo/capacitor-transitions animasi push halaman normal, dan gunakan bantuan Native Navigation hanya untuk route elemen yang bersama atau zoom.

Referensi Lengkap

Teruskan dari Menggunakan @capgo/capacitor-native-navigation

Jika Anda menggunakan Menggunakan @capgo/capacitor-native-navigation untuk merencanakan perilaku media dan interface native, hubungkan dengan @capgo/capacitor-native-navigation untuk detail implementasi di @capgo/capacitor-native-navigation, Mengawali Pemula untuk detail implementasi di Mengawali Pemula, Menggunakan @capgo/capacitor-live-activities untuk kemampuan asli di Menggunakan @capgo/capacitor-live-activities, @capgo/capacitor-live-activities untuk detail implementasi di @capgo/capacitor-live-activities, dan Menggunakan @capgo/capacitor-video-player untuk kemampuan asli di Menggunakan @capgo/capacitor-video-player.