درک 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 را حفظ می کند 🏗️
تطبیق مسیر و تفاوت ویجت
-
چیدمان ثابت:
- این
ShellRouteسازنده اجزای رابط کاربری مشترک را مانندScaffoldوBottomNavigationBar. - این مولفهها در مسیریابیها باقی میمانند زیرا مکانیسم تفاوت ویجت Flutter تضمین میکند که ویجتهای بدون تغییر استفاده مجدد میشوند.
- این
-
محتوای پویا:
- این
childپارامتر به صورت پویا بر اساس مسیر فعال به روز می شود. فقطchildتغییر می کند و بقیه چیدمان را دست نخورده نگه می دارد.
- این
-
تودرتو انعطاف پذیر:
- مسیرهای فرعی زیر
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
),
],
),
],
),
],
);
نمونه های ناوبری
-
ناوبری جاسازی شده:
- حرکت در داخل
ShellRouteو نگه داریدBottomNavigationBarقابل مشاهده:
- حرکت در داخل
context.go('/home/detail');
-
ناوبری تمام صفحه:
- حرکت در خارج از
ShellRouteو کل صفحه را پوشش دهید:
- حرکت در خارج از
context.go('/settings/detail');
چرا از کلیدهای ناوبری استفاده کنیم؟ 🗝️
- انعطاف پذیری: در زمان اجرا تصمیم بگیرید که آیا صفحه باید تعبیه شده باشد یا تمام صفحه.
- قابلیت نگهداری: سلسله مراتب مسیرهای منطقی را حفظ کنید و از رفتارهای ناوبری متنوع پشتیبانی کنید.
- عملکرد: تفاوت ویجت Flutter بهروزرسانیهای کارآمد را برای طرحبندیهای مشترک تضمین میکند.
خوراکی های کلیدی 📌
-
ShellRouteبرای مدیریت طرحبندیهای مشترک مانندBottomNavigationBarدر سراسر مسیرها - کلیدهای ناوبری امکان کنترل دقیق ناوبری را فراهم می کند و رفتارهای ترکیبی را در همان برنامه فعال می کند.
- ترکیب الگوهای ناوبری جاسازی شده و تمام صفحه، تجربه کاربر را افزایش می دهد و در عین حال کد را قابل نگهداری نگه می دارد.
با درک و استفاده از این تکنیکها، میتوانید ناوبری انعطافپذیر، کارآمد و کاربرپسند در برنامههای Flutter خود ایجاد کنید.



