برنامه نویسی

درک ShellRoute در go_router: مدیریت موثر طرح‌بندی‌های مشترک

این ShellRoute در go_router پکیج ابزاری قدرتمند برای توسعه دهندگان Flutter برای مدیریت طرح‌بندی‌های مشترک مانند است BottomNavigationBar یا AppBar در مسیرهای مختلف این مقاله توضیح می دهد که چگونه ShellRoute کار می کند و کاربرد پیشرفته را نشان می دهد، از جمله مدیریت الگوهای ناوبری جاسازی شده و تمام صفحه.


ShellRoute چیست؟ 🛤️

ShellRoute به‌عنوان محفظه‌ای برای مسیرهای کودک عمل می‌کند و طرح‌بندی ثابتی را ارائه می‌کند که در مسیرهای ناوبری ادامه دارد. به عنوان مثال، تضمین می کند که الف Scaffold و آن BottomNavigationBar دست نخورده باقی می ماند در حالی که فقط محتوای آن body به روز رسانی بر اساس مسیر فعال.

مثال 🧑‍💻:

ShellRoute(
  builder: (context, state, child) => Scaffold(
    body: child, // Dynamic content based on the active route
    bottomNavigationBar: BottomNavigationBar(
      currentIndex: _calculateIndex(state.location),
      onTap: (index) {
        if (index == 0) context.go('/home');
        if (index == 1) context.go('/settings');
      },
      items: const [
        BottomNavigationBarItem(icon: Icon(Icons.home), label: 'Home'),
        BottomNavigationBarItem(icon: Icon(Icons.settings), label: 'Settings'),
      ],
    ),
  ),
  routes: [
    GoRoute(
      path: '/home',
      builder: (context, state) => const HomeScreen(),
      routes: [
        GoRoute(
          path: 'detail',
          builder: (context, state) => const HomeDetailScreen(),
        ),
      ],
    ),
    GoRoute(
      path: '/settings',
      builder: (context, state) => const SettingsScreen(),
      routes: [
        GoRoute(
          path: 'detail',
          builder: (context, state) => const SettingsDetailScreen(),
          parentNavigatorKey: _rootNavigatorKey, // Full-screen detail
        ),
      ],
    ),
  ],
);
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در این مثال، پیمایش بین /home و /settings را به روز می کند body در حین نگهداری BottomNavigationBar قابل مشاهده است. مسیرهای تو در تو مانند /home/detail اجازه می دهد تا کنترل دقیق تری بر رفتار ناوبری داشته باشید.


ShellRoute چگونه Layout را حفظ می کند 🏗️

تطبیق مسیر و تفاوت ویجت

  1. چیدمان ثابت:

    • این ShellRoute سازنده اجزای رابط کاربری مشترک را مانند Scaffold و BottomNavigationBar.
    • این مولفه‌ها در مسیریابی‌ها باقی می‌مانند زیرا مکانیسم تفاوت ویجت Flutter تضمین می‌کند که ویجت‌های بدون تغییر استفاده مجدد می‌شوند.
  2. محتوای پویا:

    • این child پارامتر به صورت پویا بر اساس مسیر فعال به روز می شود. فقط child تغییر می کند و بقیه چیدمان را دست نخورده نگه می دارد.
  3. تودرتو انعطاف پذیر:

    • مسیرهای فرعی زیر ShellRoute طرح را به ارث می برند، در حالی که مسیرهای خارج از ShellRoute (مثل /profile) آن را به طور کامل جایگزین کنید.

ترکیب ناوبری جاسازی شده و تمام صفحه 🔀

گاهی اوقات، ممکن است بخواهید یک مسیر بسته به زمینه متفاوت رفتار کند:

  • ناوبری جاسازی شده: صفحه جزئیات در داخل ظاهر می شود ShellRoute طرح بندی
  • ناوبری تمام صفحه: صفحه نمایش جزئیات جایگزین کل طرح بندی، از جمله BottomNavigationBar.

راه حل: استفاده از کلیدهای ناوبری

با واگذاری parentNavigatorKey در مسیرهای خاص، می توانید کنترل کنید که آیا آنها در داخل نمایش داده می شوند یا خیر ShellRoute یا به صورت پوشش های تمام صفحه.

پیکربندی روتر به روز شده:

final GlobalKey<NavigatorState> _rootNavigatorKey = GlobalKey<NavigatorState>();
final GlobalKey<NavigatorState> _shellNavigatorKey = GlobalKey<NavigatorState>();

final GoRouter router = GoRouter(
  navigatorKey: _rootNavigatorKey, // Root Navigator for full-screen routes
  routes: [
    ShellRoute(
      navigatorKey: _shellNavigatorKey, // Shell Navigator for embedded routes
      builder: (context, state, child) => Scaffold(
        body: child,
        bottomNavigationBar: BottomNavigationBar(
          currentIndex: _calculateIndex(state.location),
          onTap: (index) {
            if (index == 0) context.go('/home');
            if (index == 1) context.go('/settings');
          },
          items: const [
            BottomNavigationBarItem(icon: Icon(Icons.home), label: 'Home'),
            BottomNavigationBarItem(icon: Icon(Icons.settings), label: 'Settings'),
          ],
        ),
      ),
      routes: [
        GoRoute(
          path: '/home',
          builder: (context, state) => const HomeScreen(),
          routes: [
            GoRoute(
              path: 'detail',
              builder: (context, state) => const HomeDetailScreen(),
            ),
          ],
        ),
        GoRoute(
          path: '/settings',
          builder: (context, state) => const SettingsScreen(),
          routes: [
            GoRoute(
              path: 'detail',
              builder: (context, state) => const SettingsDetailScreen(),
              parentNavigatorKey: _rootNavigatorKey, // Full-screen detail
            ),
          ],
        ),
      ],
    ),
  ],
);
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نمونه های ناوبری

  1. ناوبری جاسازی شده:

    • حرکت در داخل ShellRoute و نگه دارید BottomNavigationBar قابل مشاهده:
   context.go('/home/detail');
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  1. ناوبری تمام صفحه:

    • حرکت در خارج از ShellRoute و کل صفحه را پوشش دهید:
   context.go('/settings/detail');
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


چرا از کلیدهای ناوبری استفاده کنیم؟ 🗝️

  • انعطاف پذیری: در زمان اجرا تصمیم بگیرید که آیا صفحه باید تعبیه شده باشد یا تمام صفحه.
  • قابلیت نگهداری: سلسله مراتب مسیرهای منطقی را حفظ کنید و از رفتارهای ناوبری متنوع پشتیبانی کنید.
  • عملکرد: تفاوت ویجت Flutter به‌روزرسانی‌های کارآمد را برای طرح‌بندی‌های مشترک تضمین می‌کند.

خوراکی های کلیدی 📌

  1. ShellRoute برای مدیریت طرح‌بندی‌های مشترک مانند BottomNavigationBar در سراسر مسیرها
  2. کلیدهای ناوبری امکان کنترل دقیق ناوبری را فراهم می کند و رفتارهای ترکیبی را در همان برنامه فعال می کند.
  3. ترکیب الگوهای ناوبری جاسازی شده و تمام صفحه، تجربه کاربر را افزایش می دهد و در عین حال کد را قابل نگهداری نگه می دارد.

با درک و استفاده از این تکنیک‌ها، می‌توانید ناوبری انعطاف‌پذیر، کارآمد و کاربرپسند در برنامه‌های Flutter خود ایجاد کنید.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا