Kodax

التنقل بين الشاشات — أساسيات Flutter

التنقل في Flutter

1. التنقل البسيط (Navigator.push)

// الانتقال لشاشة جديدة
Navigator.push(
  context,
  MaterialPageRoute(builder: (context) => DetailsScreen()),
);

// الرجوع
Navigator.pop(context);

// الرجوع مع بيانات
Navigator.pop(context, 'result data');

2. تمرير البيانات

// الشاشة الأولى - إرسال
Navigator.push(
  context,
  MaterialPageRoute(
    builder: (context) => DetailsScreen(
      title: 'عنوان',
      id: 123,
    ),
  ),
);

// الشاشة الثانية - استقبال
class DetailsScreen extends StatelessWidget {
  final String title;
  final int id;

  const DetailsScreen({required this.title, required this.id});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(title)),
      body: Center(child: Text('ID: $id')),
    );
  }
}

3. Named Routes

// في main.dart
MaterialApp(
  initialRoute: '/',
  routes: {
    '/': (context) => HomeScreen(),
    '/details': (context) => DetailsScreen(),
    '/profile': (context) => ProfileScreen(),
    '/settings': (context) => SettingsScreen(),
  },
)

// التنقل
Navigator.pushNamed(context, '/details');

// مع arguments
Navigator.pushNamed(
  context,
  '/details',
  arguments: {'id': 123, 'title': 'منتج'},
);

// استقبال arguments
class DetailsScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final args = ModalRoute.of(context)!.settings.arguments as Map;
    return Text('ID: ${args['id']}');
  }
}

4. onGenerateRoute (للتحكم الكامل)

MaterialApp(
  onGenerateRoute: (settings) {
    if (settings.name == '/details') {
      final args = settings.arguments as Map;
      return MaterialPageRoute(
        builder: (context) => DetailsScreen(
          id: args['id'],
          title: args['title'],
        ),
      );
    }
    return MaterialPageRoute(builder: (context) => HomeScreen());
  },
)

5. Bottom Navigation Bar

class MainScreen extends StatefulWidget {
  @override
  _MainScreenState createState() => _MainScreenState();
}

class _MainScreenState extends State<MainScreen> {
  int _currentIndex = 0;

  final _screens = [
    HomeScreen(),
    SearchScreen(),
    ProfileScreen(),
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: _screens[_currentIndex],
      bottomNavigationBar: BottomNavigationBar(
        currentIndex: _currentIndex,
        onTap: (index) => setState(() => _currentIndex = index),
        selectedItemColor: Colors.blue,
        unselectedItemColor: Colors.grey,
        items: [
          BottomNavigationBarItem(
            icon: Icon(Icons.home),
            label: 'الرئيسية',
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.search),
            label: 'بحث',
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.person),
            label: 'حسابي',
          ),
        ],
      ),
    );
  }
}

6. Drawer (القائمة الجانبية)

Scaffold(
  appBar: AppBar(title: Text('تطبيقي')),
  drawer: Drawer(
    child: ListView(
      padding: EdgeInsets.zero,
      children: [
        DrawerHeader(
          decoration: BoxDecoration(color: Colors.blue),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            mainAxisAlignment: MainAxisAlignment.end,
            children: [
              CircleAvatar(
                radius: 30,
                backgroundImage: NetworkImage(userImage),
              ),
              SizedBox(height: 10),
              Text('أحمد محمد', style: TextStyle(color: Colors.white)),
              Text('ahmed@email.com', style: TextStyle(color: Colors.white70)),
            ],
          ),
        ),
        ListTile(
          leading: Icon(Icons.home),
          title: Text('الرئيسية'),
          onTap: () {
            Navigator.pop(context);
            Navigator.pushNamed(context, '/');
          },
        ),
        ListTile(
          leading: Icon(Icons.settings),
          title: Text('الإعدادات'),
          onTap: () {
            Navigator.pop(context);
            Navigator.pushNamed(context, '/settings');
          },
        ),
        Divider(),
        ListTile(
          leading: Icon(Icons.logout, color: Colors.red),
          title: Text('تسجيل خروج', style: TextStyle(color: Colors.red)),
          onTap: () => _logout(),
        ),
      ],
    ),
  ),
)

7. Tab Bar

class TabScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return DefaultTabController(
      length: 3,
      child: Scaffold(
        appBar: AppBar(
          title: Text('التبويبات'),
          bottom: TabBar(
            tabs: [
              Tab(icon: Icon(Icons.home), text: 'رئيسية'),
              Tab(icon: Icon(Icons.star), text: 'مميز'),
              Tab(icon: Icon(Icons.person), text: 'حسابي'),
            ],
          ),
        ),
        body: TabBarView(
          children: [
            HomeTab(),
            FeaturedTab(),
            ProfileTab(),
          ],
        ),
      ),
    );
  }
}
اختبر فهمك