MaterialApp: ما هو وكيفية إعداد widget الجذر

المؤلف: IT Sectr نُشر: 2026-07-02 وقت القراءة: 9 دق

MaterialApp هو widget الجذر في Flutter الذي يهيئ Material Design للتطبيق بأكمله. يوفر تكويناً مركزياً للتوجيه، والسمات، والتوطين، والتنقل، مضيفاً تلقائياً مكونات مثل Navigator وTheme وMediaQuery إلى Widget Tree. وفقاً لمرجع واجهة Flutter API، 2025، فإن MaterialApp هو widget إلزامي لأي تطبيق Flutter يستخدم Material Design، ويحدد إعدادات عامة متاحة في جميع أنحاء شجرة الـ widgets.

الخلاصة

  • MaterialApp — widget الجذر الذي يهيئ Material Design والتوجيه والسمات لتطبيق Flutter.
  • السمات عبر المعلمتين theme وdarkTheme تحدد نظام الألوان والخطوط والأنماط للتطبيق بأكمله.
  • التوجيه من خلال routes وonGenerateRoute يوفر التنقل بين شاشات التطبيق.
  • التوطين عبر localizationsDelegates وsupportedLocales يضيف دعم لغات متعددة.
  • InheritedWidgets المتداخلة — MaterialApp يضيف تلقائياً Theme وMediaQuery وNavigator وLocalizations إلى الشجرة.

ما هو MaterialApp في Flutter؟

MaterialApp هو widget غلاف يقوم بتهيئة Material Design في تطبيق Flutter. وهو جذر Widget Tree ويوفر للـ widgets التابعة إمكانية الوصول إلى خدمات النظام: التنقل، والسمة، واستعلامات الوسائط، والتوطين. بدون MaterialApp، لن يكون للتطبيق نمط Material القياسي ولن يتمكن من استخدام widgets مثل Scaffold وAppBar وFloatingActionButton وBottomNavigationBar.

ماذا يضيف MaterialApp إلى Widget Tree

عند استخدام MaterialApp، يضيف Flutter تلقائياً عدة widgets رئيسية إلى جذر الشجرة: Navigator (كومة شاشات للتنقل)، Theme (نظام الألوان والأنماط)، MediaQuery (معلومات الجهاز)، Localizations (سلاسل مترجمة)، Directionality (اتجاه النص). هذه الـ widgets مطبقة كـ InheritedWidgets ويمكن الوصول إليها عبر BuildContext في أي مكان في التطبيق.

الاستخدام الأساسي

التكوين الأدنى لـ MaterialApp يتطلب فقط المعلمة home — الـ widget الذي يظهر على الشاشة الرئيسية. يقوم Flutter تلقائياً بتغليف home في Scaffold إذا لم يكن Scaffold بالفعل، عبر آلية WidgetsBinding. عند تشغيل التطبيق باستخدام runApp(MaterialApp(home: MyHomePage()))، ينشئ Flutter Widget Tree جذراً مع MaterialApp كجذر.

dart
void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "My Application",
      theme: ThemeData(
        primarySwatch: Colors.blue,
        fontFamily: "Roboto",
      ),
      darkTheme: ThemeData(
        brightness: Brightness.dark,
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(),
    );
  }
}

في هذا المثال، يقوم MaterialApp بتهيئة السمة الأساسية (فاتحة وداكنة)، والعنوان، والشاشة الرئيسية. تُستخدم المعلمة title لعنوان النافذة (على سطح المكتب) ولإمكانية الوصول. تحدد المعلمتان theme وdarkTheme مظهر التطبيق في الأوضاع المختلفة.

هيكل ومعلمات MaterialApp

MaterialApp يقبل أكثر من 30 معلمة، والتي تنقسم إلى فئات: إعدادات Material Design، والتوجيه، والسمات، والتوطين، وسلوك الأخطاء، والإعدادات الخاصة بالمنصة. معرفة المعلمات الرئيسية تسمح بتكوين التطبيق بمرونة دون كتابة كود إضافي.

معلمات التكوين الرئيسية

المعلمة title تحدد اسم التطبيق لعنوان النافذة وإمكانية الوصول. color تحدد لون التطبيق لمبدل المهام على Android. debugShowCheckedModeBanner تخفي بانر وضع التصحيح في إصدارات الإطلاق. showPerformanceOverlay تفعّل تراكباً بمعلومات الأداء. supportDarkTheme تشير إلى ما إذا كان التطبيق يدعم السمة الداكنة.

معلمات خاصة بالمنصة

MaterialApp يوفر معلمات لتكوين السلوك على منصات مختلفة: restorationScopeId للحفاظ على حالة التطبيق عند إعادة التشغيل على Android، scrollBehavior لتكوين سلوك التمرير على أنظمة تشغيل مختلفة، useMaterial3 لتفعيل Material 3 (Material You). يضيف Material 3 ألواناً ديناميكية، ومكونات جديدة، وأنماطاً محدثة.

المعلمةالنوعالغرض
titleStringعنوان نافذة التطبيق
themeThemeDataتكوين السمة الفاتحة
darkThemeThemeDataتكوين السمة الداكنة
homeWidgetالشاشة الرئيسية للتطبيق
routesMap<String, WidgetBuilder>خريطة المسارات المسماة
localeLocaleالإعدادات الإقليمية الإجبارية للتطبيق

السمات باستخدام theme وdarkTheme

السمات هي إحدى المعلمات الرئيسية لـ MaterialApp. المعلمة theme تقبل كائن ThemeData الذي يحدد لوحة الألوان، والطباعة، وأشكال المكونات، والأيقونات للسمة الفاتحة. المعلمة darkTheme هي التكوين المكافئ للسمة الداكنة. يقوم Flutter تلقائياً بتبديل السمة وفقاً لإعدادات نظام الجهاز.

ThemeData: نظام الألوان

ThemeData يتضمن primarySwatch (اللون الأساسي)، colorScheme (نظام ألوان ممتد لـ Material 3)، brightness (فاتح أو داكن)، fontFamily (الخط الافتراضي)، textTheme (أنماط النص)، cardTheme، appBarTheme، buttonTheme وعشرات المعلمات الأخرى لتخصيص مكونات محددة. استخدم colorScheme لـ Material 3 وprimarySwatch لـ Material 2.

الألوان الديناميكية لـ Material 3

Material 3 (Material You) يدعم الألوان الديناميكية، والتي تُستخرج من خلفية الجهاز على Android 12+. لتفعيلها، اضبط useMaterial3: true واستخدم colorScheme.fromSeed أو colorScheme.fromImageProvider. الألوان الديناميكية تولد تلقائياً لوحة متناغمة من 5 درجات: primary، secondary، tertiary، neutral وneutralVariant.

الوصول إلى السمة في الـ widgets

أي widget يمكنه الوصول إلى السمة الحالية عبر Theme.of(context). يُعيد Theme.of كائن ThemeData يمكن من خلاله الحصول على الألوان و textTheme ومعلمات أخرى. للاشتراك في تغييرات السمة (على سبيل المثال، عند التبديل بين الوضع الفاتح والداكن)، استخدم السياق داخل طريقة build — سيقوم Flutter تلقائياً بإعادة بناء الـ widget عند تغيير السمة.

dart
Container(
  color: Theme.of(context).colorScheme.primary,
  child: Text(
    "Themed text example",
    style: Theme.of(context).textTheme.headlineMedium,
  ),
)

في هذا المثال، يحصل Theme.of(context) على السمة الحالية من أقرب MaterialApp. يطابق لون الخلفية ونمط النص تلقائياً السمة الحالية (فاتحة أو داكنة). عند تبديل السمة، سيتم إعادة بناء Container وText بقيم جديدة من ThemeData المحدّث.

التوجيه والتنقل في MaterialApp

MaterialApp يدمج Navigator — متصفح قائم على الكومة يدير الانتقالات بين الشاشات. تحدد المعلمات initialRoute وroutes وonGenerateRoute كيفية معالجة Flutter للتنقل. يتيح Navigator.push وNavigator.pushReplacement تبديل الشاشات برمجياً، بينما يتيح Navigator.pop العودة للخلف.

المسارات المسماة (routes)

المعلمة routes تقبل Map<String, WidgetBuilder>، حيث المفتاح هو اسم المسار (سلسلة) والقيمة هي دالة تنشئ الـ widget لتلك الشاشة. المسارات المسماة مناسبة للتنقل الثابت: '/' (المسار الجذر) يتوافق عادة مع home، و'/settings' و'/profile' — شاشات أخرى. ينتقل Navigator.pushNamed(context, '/settings') إلى شاشة الإعدادات.

توليد المسارات (onGenerateRoute)

onGenerateRoute هي دالة تُستدعى عندما لا يتم العثور على مسار في routes. تقبل RouteSettings وتُعيد MaterialPageRoute. هذا النهج مفيد للتنقل الديناميكي عندما تعتمد المسارات على بيانات (مثلاً /user/42). يحلل onGenerateRoute اسم المسار، ويستخرج المعلمات، وينشئ الشاشة المناسبة.

الروابط العميقة والتوجيه المسمى

لدعم الروابط العميقة (deep links)، استخدم المعلمتين onGenerateInitialRoute وonGenerateRoute معاً. تسمح الروابط العميقة بفتح شاشة معينة من التطبيق عبر URL (مثلاً https://example.com/promo). يعالج Flutter الروابط العميقة على Android (عبر intent filters) وiOS (عبر universal links) ويمرر المسار إلى onGenerateRoute.

dart
MaterialApp(
  initialRoute: "/",
  routes: {
    "/": (context) => const HomePage(),
    "/settings": (context) => const SettingsPage(),
  },
  onGenerateRoute: (settings) {
    if (settings.name?.startsWith("/user/") == true) {
      final userId = settings.name!.split("/").last;
      return MaterialPageRoute(
        builder: (_) => UserPage(userId: userId),
      );
    }
    return null;
  },
)

في هذا المثال، يعالج onGenerateRoute المسارات الديناميكية مثل /user/42. إذا لم يتم العثور على المسار في المسارات الثابتة ولم يتطابق مع النمط الديناميكي، يعرض Flutter صفحة خطأ يمكن تخصيصها عبر onUnknownRoute.

التوطين والعولمة

MaterialApp يوفر دعماً مدمجاً للتوطين عبر المعلمتين localizationsDelegates وsupportedLocales. تقوم LocalizationsDelegates بتحميل السلاسل المترجمة، ويحدد supportedLocales اللغات التي يدعمها التطبيق. يكتشف Flutter تلقائياً لغة الجهاز ويحمل الموارد المترجمة المقابلة.

إعداد supportedLocales وlocalizationsDelegates

المعلمة supportedLocales تقبل قائمة من Locales التي يدعمها التطبيق: [const Locale('en'), const Locale('ru'), const Locale('de')]. localizationsDelegates هي قائمة بالمفوضين الذين يقومون بتحميل السلاسل المترجمة. لـ Material Design، أضف GlobalMaterialLocalizations.delegate وGlobalWidgetsLocalizations.delegate وGlobalCupertinoLocalizations.delegate.

توطين سلاسل التطبيق

لتوطين السلاسل الخاصة بك، استخدم الفئة AppLocalizations، المنشأة عبر flutter_localizations أو حزمة intl. توفر AppLocalizations طرقاً ثابتة للوصول إلى السلاسل المترجمة: AppLocalizations.of(context)!.helloMessage. يقوم MaterialApp تلقائياً بتمرير Localizations إلى Widget Tree، مما يجعلها متاحة عبر السياق.

  • flutter_localizations — الحزمة الرسمية لتوطين widgets Material والسلاسل النظامية.
  • intl — حزمة العولمة: تنسيق الأرقام والتواريخ والعملات والجمع.
  • ملفات ARB — تنسيق تخزين السلاسل المترجمة، المستخدم من قبل flutter_localizations وintl.

MaterialApp مقابل CupertinoApp مقابل WidgetsApp

يوفر Flutter ثلاثة widgets جذرية لمنصات مختلفة: MaterialApp (Material Design لنظام Android والويب)، CupertinoApp (نمط iOS)، وWidgetsApp (widget أساسي بدون تنسيق). يحدد اختيار الـ widget الجذر مظهر التطبيق بأكمله وتوفر المكونات الخاصة بالمنصة.

MaterialApp: الخيار العالمي

MaterialApp مناسب لمعظم التطبيقات بفضل دعم Material Design الذي يبدو رائعاً على Android والويب وسطح المكتب. يوفر Material Design مكتبة غنية من المكونات: Scaffold، AppBar، BottomNavigationBar، Drawer، SnackBar، Dialog وغيرها الكثير. يدعم MaterialApp أيضاً Material 3 مع الألوان الديناميكية.

CupertinoApp: نمط iOS

CupertinoApp يستخدم Cupertino Design، الذي يتبع إرشادات واجهة المستخدم البشرية من Apple. يوفر CupertinoPageScaffold وCupertinoNavigationBar وCupertinoTabBar ومكونات أخرى بنمط iOS. استخدم CupertinoApp لتطبيقات iOS أو التطبيقات التي تتبع نمط Apple على جميع المنصات.

WidgetsApp: جذر بسيط

WidgetsApp هو الـ widget الجذري الأساسي بدون تنسيق. يضيف Navigator وMediaQuery وLocalizations ولكنه لا يوفر سمات أو مكونات Material/Cupertino. WidgetsApp مناسب لأنظمة التصميم المخصصة، والألعاب، أو التطبيقات ذات التنسيق الخاص حيث يكون Material أو Cupertino زائداً عن الحاجة.

الـ widget الجذرنظام التصميممتى تستخدم
MaterialAppMaterial Design (Google)Android، ويب، سطح مكتب، تطبيقات متعددة المنصات
CupertinoAppCupertino (Apple HIG)تطبيقات iOS، نمط Apple على جميع المنصات
WidgetsAppبدون تنسيقتصميم مخصص، ألعاب، أنظمة تصميم خاصة

الأسئلة الشائعة

هل MaterialApp إلزامي في تطبيق Flutter؟

ليس إلزامياً — يمكنك استخدام CupertinoApp لنمط iOS أو WidgetsApp للتصميم المخصص. MaterialApp إلزامي إذا كنت تستخدم widgets Material: Scaffold، AppBar، FloatingActionButton وغيرها.

كيفية تبديل السمة في MaterialApp؟

استخدم المعلمتين theme (السمة الفاتحة) وdarkTheme (السمة الداكنة). يقوم Flutter تلقائياً بتبديل السمة وفقاً لإعدادات النظام. للتبديل الإجباري، استخدم WidgetsBinding.instance.platformDispatcher.platformBrightness.

هل يمكن استخدام MaterialApp بدون Material 3؟

نعم، افتراضياً useMaterial3 يساوي false ويستخدم MaterialApp Material 2. لتفعيل Material 3، اضبط useMaterial3: true واستخدم colorScheme من ColorScheme.fromSeed.

كيفية إضافة صفحة خطأ 404 مخصصة؟

استخدم المعلمة onUnknownRoute، التي تقبل RouteSettings وتُعيد MaterialPageRoute. إذا لم تعالج routes أو onGenerateRoute المسار، يُستدعى onUnknownRoute — أعد فيها صفحة برسالة خطأ.

ماذا يحدث إذا لم يتم تحديد home في MaterialApp؟

إذا لم يتم تحديد المعلمة home ولا توجد routes، يطرح Flutter استثناءً عند التشغيل. يجب تحديد واحد على الأقل من التالي: home، أو routes بمسار '/'، أو initialRoute.

الملخص

  • MaterialApp — هو widget الجذر في Flutter لتكوين Material Design والتوجيه والسمات والتوطين للتطبيق.
  • المعلمات الرئيسية: title، theme، darkTheme، home، routes، locale وuseMaterial3 لـ Material 3.
  • السمات عبر ThemeData تحدد الألوان والخطوط والأنماط المتاحة عبر Theme.of(context) في أي widget.
  • التوجيه عبر routes (مسارات ثابتة) وonGenerateRoute (مسارات ديناميكية) يوفر تنقلاً مرناً.
  • التوطين عبر supportedLocales وlocalizationsDelegates يضيف دعم لغات متعددة.
  • MaterialApp يدمج تلقائياً Navigator وTheme وMediaQuery وLocalizations وDirectionality في Widget Tree.
  • البدائل: CupertinoApp (نمط iOS) وWidgetsApp (تصميم مخصص) للتطبيقات بدون Material Design.

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا