![]() |
| مشكلة الأداء عند التبديل بين الشاشات؟ IndexedStack يحلها بسهولة |
لماذا يفضل المحترفون IndexedStack على Navigator؟
في تطوير واجهات المستخدم باستخدام Flutter، يلعب اختيار الأدوات (Widgets) المناسبة دورًا حيويًا في تحقيق أداء عالٍ وتجربة مستخدم سلسة. واحدة من هذه الأدوات هي IndexedStack، وهي وحدة قوية تُستخدم لإدارة عرض مجموعة من الأبناء (Children) بطريقة فعالة. في هذا المقال، سنستعرض كيفية استخدام IndexedStack في الكود المقدم، وكيفية تحسين الأداء وتوفير تجربة مستخدم أفضل.
ما هو IndexedStack؟
IndexedStack هو ويدجت في Flutter يسمح بعرض واحد فقط من بين عدة أبناء في وقت معين. يتم تحديد الابن الذي سيتم عرضه باستخدام خاصية index. على عكس Stack العادي الذي يقوم بتراكب جميع الأبناء فوق بعضهم البعض، فإن IndexedStack يعرض فقط الابن المحدد بواسطة الفهرس (index) ويحتفظ بحالة جميع الأبناء الأخرى في الذاكرة.
IndexedStack من اهم مميزات
أحد أهم مميزات IndexedStack هو أنه يحافظ على حالة جميع الأبناء حتى إذا لم يتم عرضها. على سبيل المثال، إذا كان المستخدم في DashBoardLayout() ثم انتقل إلى OrdersScreen()، فسيتم الاحتفاظ بحالة DashBoardLayout() عند العودة إليها. هذا يجعل الانتقال بين الشاشات سريعًا وسلسًا.
فوائد استخدام IndexedStack في هذا السياق
- سهولة الإدارة: يمكن إدارة عرض الشاشات المختلفة بسهولة عن طريق تغيير الفهرس فقط.
- الحفاظ على الحالة: كما ذكرنا سابقًا، يتم الاحتفاظ بحالة كل شاشة حتى عند التبديل بينها.
- أداء عالٍ: نظرًا لأن الشاشات لا يتم إنشاؤها وإعادة بنائها عند كل تبديل، فإن الأداء يكون أفضل مقارنة باستخدام أدوات مثل Navigator أو PageView.
استخدام IndexedStack في الكود المقدم يعكس فهمًا جيدًا لأدوات Flutter وإمكاناتها. يوفر IndexedStack طريقة فعالة لإدارة عرض الشاشات المختلفة مع الحفاظ على الحالة والأداء. ومع ذلك، يجب مراعاة التحديات المحتملة مثل استهلاك الذاكرة وإدارة الحالة الديناميكية لضمان تجربة مستخدم مثالية.
مثال حول استخدام IndexedStack في Flutter
في هذا المثال، سنوضح كيفية استخدام IndexedStack لإنشاء تطبيق بسيط يحتوي على ثلاث شاشات رئيسية يتم التبديل بينها باستخدام أزرار التنقل السفلي (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(
title: 'IndexedStack Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const HomeScreen(),
);
}
}
class HomeScreen extends StatefulWidget {
const HomeScreen({super.key});
@override
State<HomeScreen> createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
// الفهرس الحالي للشاشة المعروضة
int _currentIndex = 0;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('IndexedStack Example'),
),
body: IndexedStack(
index: _currentIndex, // تحديد الشاشة المعروضة بناءً على الفهرس
children: const [
Screen1(), // الشاشة الأولى
Screen2(), // الشاشة الثانية
Screen3(), // الشاشة الثالثة
],
),
bottomNavigationBar: BottomNavigationBar(
currentIndex: _currentIndex, // الفهرس الحالي
onTap: (index) {
setState(() {
_currentIndex = index; // تحديث الفهرس عند النقر على زر التنقل
});
},
items: const [
BottomNavigationBarItem(
icon: Icon(Icons.home),
label: 'Home',
),
BottomNavigationBarItem(
icon: Icon(Icons.search),
label: 'Search',
),
BottomNavigationBarItem(
icon: Icon(Icons.person),
label: 'Profile',
),
],
),
);
}
}
// الشاشة الأولى
class Screen1 extends StatelessWidget {
const Screen1({super.key});
@override
Widget build(BuildContext context) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: const [
Icon(Icons.home, size: 100, color: Colors.blue),
SizedBox(height: 20),
Text(
'Home Screen',
style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
),
],
),
);
}
}
// الشاشة الثانية
class Screen2 extends StatelessWidget {
const Screen2({super.key});
@override
Widget build(BuildContext context) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: const [
Icon(Icons.search, size: 100, color: Colors.green),
SizedBox(height: 20),
Text(
'Search Screen',
style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
),
],
),
);
}
}
// الشاشة الثالثة
class Screen3 extends StatelessWidget {
const Screen3({super.key});
@override
Widget build(BuildContext context) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: const [
Icon(Icons.person, size: 100, color: Colors.purple),
SizedBox(height: 20),
Text(
'Profile Screen',
style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
),
],
),
);
}
}