Lompat ke konten utama
Kembali ke plugin
@capgo/capacitor-native-navigation
Tutorial
oleh github.com/Cap-go

Navigasi Native

Mengrender navbar, tabbar, dan shell transisi native di atas WebView penuh layar Capacitor

Demo

Demo WebP animasi

Demo navigasi native yang animasi menampilkan navbar native, tab, dan konten WebView.

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

Petunjuk

Tutorial Navigasi Native

Menggunakan @capgo/capacitor-native-navigation

@capgo/capacitor-native-navigation Mengrender navigasi native atas, tab bawah, dan transisi rute shell di atas WebView layar tunggal Capacitor. Framework web Anda masih mengontrol rute dan konten, sementara native mengontrol 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 native ke router Anda

Bar-bar native mengeluarkan niat. Router Anda masih melakukan perubahan rute:

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

Animasikan perubahan rute

Gunakan transaksi transisi sekitar perubahan rute 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 rute 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 native

Ketika contentInsetMode __CAPGO_KEEP_0__ cssMenulis 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, circledan rect, yang mencakup set ikon umum seperti Lucide dan Feather.

Combinasikan dengan @capgo/capacitor-transisi

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

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

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

Gerakkan 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 rute. Biarkan @capgo/capacitor-transitions animasi push halaman normal, dan gunakan bantuan zoom Native Navigation hanya untuk rute elemen 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 antarmuka native, hubungkannya dengan @capgo/capacitor-native-navigation untuk detail implementasi di @capgo/capacitor-native-navigation, Mulai Berjalan untuk detail implementasi di Mulai Berjalan, Menggunakan @capgo/capacitor-aktivitas-hidup untuk kemampuan asli di Menggunakan @capgo/capacitor-aktivitas-hidup, @capgo/capacitor-aktivitas-hidup untuk detail implementasi di @capgo/capacitor-aktivitas-hidup, dan Menggunakan @capgo/capacitor-pemain-video untuk kemampuan asli di Menggunakan @capgo/capacitor-pemain-video.