درک 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 خود ایجاد کنید.