أشرطة التبويب والقوائم الجانبية
نفّذ أنماط التنقل الشائعة مثل TabBars لعرض متعدد الصفحات وDrawers لقوائم التنقل الجانبية
أشرطة التبويب والقوائم الجانبية درس مجاني في Flutter Mobile Development على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Flutter Mobile Development، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Flutter Mobile Development 4 دروس في المجموع.
بعض أجزاء هذا الدرس لم تُترجم بعد وتظهر باللغة الإنجليزية.
Intro to Navigation Patterns
Flutter offers powerful patterns for app navigation. Today, we explore two common ones: TabBars and Drawers.
These widgets help users navigate between different sections of your app smoothly and intuitively.
- TabBars are great for switching between related views.
- Drawers provide a side menu for global navigation or settings.
What are TabBars?
A TabBar is a horizontal row of tabs, often found at the top or bottom of a screen. Each tab represents a different view or category of content.
When a user taps a tab, the content below it changes without leaving the current screen.
Building a Basic TabBar
To use tabs, you often wrap your Scaffold with a DefaultTabController. This controller manages the selected tab.
Then, place a TabBar widget inside your AppBar's bottom property or as a BottomNavigationBar.
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: DefaultTabController(
length: 3, // Number of tabs
child: Scaffold(
appBar: AppBar(
title: const Text('My Tab App'),
bottom: const TabBar(
tabs: [
Tab(icon: Icon(Icons.home), text: 'Home'),
Tab(icon: Icon(Icons.settings), text: 'Settings'),
Tab(icon: Icon(Icons.info), text: 'Info'),
],
),
),
body: const TabBarView(
children: [
Center(child: Text('Home Content')),
Center(child: Text('Settings Content')),
Center(child: Text('Info Content')),
],
),
),
),
);
}
}TabBarView in Action
The TabBarView widget works hand-in-hand with TabBar. It displays the content corresponding to the currently selected tab.
Make sure the number of children in TabBarView matches the length of your DefaultTabController and the number of Tab widgets.
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: DefaultTabController(
length: 3, // Must match the number of tabs
child: Scaffold(
appBar: AppBar(
title: const Text('Tab Views'),
bottom: const TabBar(
tabs: [
Tab(text: 'Explore'),
Tab(text: 'Favorites'),
Tab(text: 'Profile'),
],
),
),
body: TabBarView( // Content for each tab
children: [
Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: const [
Icon(Icons.explore, size: 80, color: Colors.blue),
Text('Explore new content!', style: TextStyle(fontSize: 20)),
],
),
),
Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: const [
Icon(Icons.favorite, size: 80, color: Colors.red),
Text('Your favorite items.', style: TextStyle(fontSize: 20)),
],
),
),
Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: const [
Icon(Icons.person, size: 80, color: Colors.green),
Text('Your user profile.', style: TextStyle(fontSize: 20)),
],
),
),
],
),
),
),
);
}
}Styling Your Tabs
You can customize the look of your TabBar. For example, change colors, indicator styles, or label styles.
The indicatorColor and labelColor properties are common ways to match your app's theme.
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: DefaultTabController(
length: 2,
child: Scaffold(
appBar: AppBar(
title: const Text('Custom Tabs'),
bottom: TabBar(
indicatorColor: Colors.yellowAccent, // Custom indicator color
labelColor: Colors.white, // Color for selected tab
unselectedLabelColor: Colors.grey[400], // Color for unselected tabs
tabs: const [
Tab(icon: Icon(Icons.call), text: 'Calls'),
Tab(icon: Icon(Icons.chat), text: 'Chats'),
],
),
),
body: const TabBarView(
children: [
Center(child: Text('Calls Log')),
Center(child: Text('Chat Messages')),
],
),
),
),
);
}
}What is a Drawer?
A Drawer is a panel that slides out from the side of the screen, typically from the left. It's often used for main navigation links or global settings.
Drawers are perfect for apps with many sections that don't fit into a TabBar or BottomNavigationBar.
Adding a Side Drawer
To add a drawer, simply include a Drawer widget as a child of your Scaffold. Flutter automatically adds a menu icon to your AppBar.
Inside the Drawer, you'll typically use a ListView to hold multiple ListTile widgets, representing navigation items.
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('My Drawer App'),
),
drawer: Drawer( // The Drawer widget
child: ListView(
padding: EdgeInsets.zero, // Remove padding
children: <Widget>[
const DrawerHeader( // Top part of the drawer
decoration: BoxDecoration(
color: Colors.blue,
),
child: Text(
'App Menu',
style: TextStyle(
color: Colors.white,
fontSize: 24,
),
),
),
ListTile( // A navigation item
leading: const Icon(Icons.message),
title: const Text('Messages'),
onTap: () {
// Handle tap
Navigator.pop(context); // Close the drawer
},
),
ListTile(
leading: const Icon(Icons.account_circle),
title: const Text('Profile'),
onTap: () {
// Handle tap
Navigator.pop(context);
},
),
ListTile(
leading: const Icon(Icons.settings),
title: const Text('Settings'),
onTap: () {
// Handle tap
Navigator.pop(context);
},
),
],
),
),
body: const Center(
child: Text('Pull from left to open drawer!'),
),
),
);
}
}Handling Drawer Taps
When a user taps an item in the drawer, you usually want to perform an action, like navigating to a new screen or updating content.
Remember to call Navigator.pop(context) after an item is tapped to close the drawer, providing a smooth user experience.
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Drawer Actions'),
),
drawer: Drawer(
child: ListView(
padding: EdgeInsets.zero,
children: <Widget>[
const DrawerHeader(
decoration: BoxDecoration(color: Colors.green),
child: Text('Navigation', style: TextStyle(color: Colors.white)),
),
ListTile(
leading: const Icon(Icons.home),
title: const Text('Go Home'),
onTap: () {
// Close drawer, then navigate (or just close if already on home)
Navigator.pop(context);
// Example: Navigator.push(context, MaterialPageRoute(builder: (context) => HomeScreen()));
},
),
ListTile(
leading: const Icon(Icons.bookmark),
title: const Text('View Bookmarks'),
onTap: () {
Navigator.pop(context); // Close drawer
// Show a snackbar as an example action
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Viewing Bookmarks!'))
);
},
),
],
),
),
body: const Center(
child: Text('Try opening the drawer and tapping an item.'),
),
),
);
}
}Customizing Your Drawer
Drawers can be highly customized. You can add user profile info, app version, or even search bars.
- Use
UserAccountsDrawerHeaderfor a pre-built header with user info. - Keep the number of items manageable to avoid clutter.
- Group related items logically using dividers.
TabBar vs. Drawer
Which of the following scenarios is best suited for using a Flutter TabBar?
TabBars & Drawers Recap
Great job! You've learned how to implement two essential navigation patterns:
- TabBars for switching between related views using
DefaultTabController,TabBar, andTabBarView. - Drawers for side navigation menus using the
Drawerwidget andListTiles.
Choose the right pattern based on your app's complexity and user flow. Keep exploring to build more intuitive UIs!
الأسئلة الشائعة
هل درس «أشرطة التبويب والقوائم الجانبية» مجاني؟
نعم — نص درس «أشرطة التبويب والقوائم الجانبية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Flutter Mobile Development، انتقل إلى CoddyKit PRO. تتضمن دورة Flutter Mobile Development 4 دروس في المجموع.
ماذا ستتعلم في «أشرطة التبويب والقوائم الجانبية»؟
نفّذ أنماط التنقل الشائعة مثل TabBars لعرض متعدد الصفحات وDrawers لقوائم التنقل الجانبية تتمرن على Flutter Mobile Development مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Flutter Mobile Development؟
لا تُشترط خبرة سابقة. Flutter Mobile Development على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «أشرطة التبويب والقوائم الجانبية»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Flutter Mobile Development هذا؟
نعم. كل درس في Flutter Mobile Development يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- التنقل الأساسي بين الصفحات
- المسارات المسمّاة والوسائط
- أشرطة التبويب والقوائم الجانبية
- الربط العميق والتنقل عبر URL