MDC-101 Flutter: أساسيات المكوّنات المادية

1. مقدمة

ما هو التصميم المتعدد الأبعاد ومكتبة Material Flutter؟

‫التصميم المتعدد الأبعاد هو نظام لإنشاء منتجات رقمية جريئة وجميلة. من خلال توحيد الأسلوب والعلامة التجارية والتفاعل والحركة ضمن مجموعة متسقة من المبادئ والمكوّنات، يمكن لفِرق المنتجات تحقيق أكبر إمكانات التصميم.

تتضمّن مكتبة Material Flutter عناصر واجهة مستخدم Flutter التي تنفّذ تصاميم مكوّنات التصميم المتعدد الأبعاد (MDC باختصار) لإنشاء تجربة مستخدم متّسقة على مستوى التطبيقات والمنصات. مع تطوّر نظام التصميم المتعدد الأبعاد، يتم تعديل هذه المكوّنات لضمان تنفيذها بشكلٍ متّسق ودقيق، مع الالتزام بمعايير تطوير الواجهة الأمامية في Google.

في هذا الدرس التطبيقي حول الترميز، ستنشئ صفحة تسجيل دخول باستخدام العديد من مكوّنات Material Flutter.

ما ستنشئه

هذا الدرس التطبيقي حول الترميز هو الأول من أربعة دروس تطبيقية حول الترميز سترشدك خلال عملية إنشاء تطبيق باسم Shrine، وهو تطبيق للتجارة الإلكترونية يبيع الملابس والسلع المنزلية. سيوضّح لك هذا المستند كيف يمكنك تخصيص المكوّنات لتعكس أي علامة تجارية أو تصميم باستخدام Material Flutter.

في هذا الدرس التطبيقي حول الترميز، ستنشئ صفحة تسجيل دخول إلى تطبيق Shrine تتضمّن ما يلي:

  • صورة شعار Shrine
  • اسم التطبيق (Shrine)
  • حقلان نصيان، أحدهما لإدخال اسم المستخدم والآخر لكلمة المرور
  • زرّان

Android

iOS

صفحة تسجيل الدخول إلى Shrine على جهاز Android

صفحة تسجيل الدخول إلى Shrine على أجهزة iOS

مكوّنات Material Flutter والأنظمة الفرعية في هذا الدرس التطبيقي حول الترميز

  • حقل نصي
  • زرّ
  • تموّج الحبر (شكل مرئي من أشكال الملاحظات حول أحداث اللمس)

ما هو تقييمك لمستوى خبرتك في تطوير تطبيقات Flutter؟

مبتدئ متوسط متقدّم

2. إعداد بيئة تطوير Flutter

تحتاج إلى برنامجَين لإكمال هذا الدرس التطبيقي، وهما حزمة تطوير البرامج (SDK) الخاصة بإطار عمل Flutter ومحرِّر.

يمكنك تشغيل الدرس العملي باستخدام أيّ من الأجهزة التالية:

  • جهاز Android أو iOS فعلي متصل بالكمبيوتر وتم ضبطه على "وضع مطور البرامج"
  • محاكي iOS (يتطلّب تثبيت أدوات Xcode)
  • محاكي Android (يتطلّب الإعداد في "استوديو Android")
  • متصفّح (يجب استخدام Chrome لتصحيح الأخطاء).
  • كتطبيق سطح مكتب على Windows أو Linux أو macOS يجب أن يتم التطوير على النظام الأساسي الذي تخطّط للنشر عليه. لذا، إذا أردت تطوير تطبيق سطح مكتب لنظام التشغيل Windows، يجب أن يتم التطوير على Windows للوصول إلى سلسلة الإنشاء المناسبة. هناك متطلبات خاصة بنظام التشغيل يتم تناولها بالتفصيل على الرابط docs.flutter.dev/desktop.

3- تنزيل تطبيق بدء الدرس التطبيقي حول الترميز

يقع مشروع التطبيق الأوّلي في الدليل material-components-flutter-codelabs-101-starter/mdc_100_series.

...أو استنسِخه من GitHub

لاستنساخ هذا الدرس التطبيقي حول الترميز من GitHub، شغِّل الأوامر التالية:

git clone https://github.com/material-components/material-components-flutter-codelabs.git
cd material-components-flutter-codelabs/mdc_100_series
git checkout 101-starter

افتح المشروع وشغِّل التطبيق

  1. افتح المشروع في المحرِّر الذي تختاره.
  2. اتّبِع التعليمات الواردة في مقالة البدء: تجربة القيادة ضمن القسم "تشغيل التطبيق" في المحرّر الذي اخترته.

اكتمال النقل بنجاح يجب أن يكون رمز البداية لصفحة تسجيل الدخول في Shrine قيد التشغيل على جهازك. يجب أن يظهر لك شعار Shrine والاسم "Shrine" أسفله مباشرةً.

Android

iOS

شعار Shrine

شعار Shrine

لنلقِ نظرة على الرمز.

التطبيقات المصغّرة في login.dart

افتح login.dart. يجب أن يتضمّن ما يلي:

import 'package:flutter/material.dart';

class LoginPage extends StatefulWidget {
  const LoginPage({Key? key}) : super(key: key);

  @override
  _LoginPageState createState() => _LoginPageState();
}

class _LoginPageState extends State<LoginPage> {
  // TODO: Add text editing controllers (101)
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: ListView(
          padding: const EdgeInsets.symmetric(horizontal: 24.0),
          children: <Widget>[
            const SizedBox(height: 80.0),
            Column(
              children: <Widget>[
                Image.asset('assets/diamond.png'),
                const SizedBox(height: 16.0),
                const Text('SHRINE'),
              ],
            ),
            const SizedBox(height: 120.0),
            // TODO: Remove filled: true values (103)
            // TODO: Add TextField widgets (101)
            // TODO: Add button bar (101)
          ],
        ),
      ),
    );
  }
}

لاحظ أنّه يحتوي على عبارة import وصنفَين جديدَين:

  • تسمح عبارة import باستخدام مكتبة Material في هذا الملف.
  • يمثّل الصف LoginPage الصفحة بأكملها المعروضة في المحاكي.
  • تتحكّم الدالة build() في الفئة _LoginPageState في طريقة إنشاء جميع التطبيقات المصغّرة في واجهة المستخدم.

4. إضافة عناصر واجهة مستخدم TextField

للبدء، سنضيف حقلَي نص إلى صفحة تسجيل الدخول، حيث يُدخِل المستخدمون اسم المستخدم وكلمة المرور. سنستخدم أداة TextField التي تعرض تصنيفًا عائمًا وتفعّل تأثير التموج عند اللمس.

تم تصميم هذه الصفحة في المقام الأول باستخدام ListView، الذي يرتب العناصر الثانوية في عمود قابل للتمرير. لنضع حقول النص أدناه.

إضافة عناصر واجهة المستخدم TextField

أضِف حقلَي نص جديدَين وفاصلًا بعد const SizedBox(height: 120.0).

// TODO: Add TextField widgets (101)
// [Name]
TextField(
  decoration: const InputDecoration(
    filled: true,
    labelText: 'Username',
  ),
),
// spacer
const SizedBox(height: 120.0),
// [Password]
TextField(
  decoration: const InputDecoration(
    filled: true,
    labelText: 'Password',
  ),
  obscureText: true,
),

تحتوي الحقول النصية على حقل decoration: يأخذ أداة InputDecoration. يشير الحقل filled: إلى أنّ خلفية حقل النص مملوءة بشكل خفيف لمساعدة المستخدمين في التعرّف على مساحة النقر أو مساحة اللمس في حقل النص. تستبدل قيمة obscureText: true في حقل النص الثاني تلقائيًا الإدخال الذي يكتبه المستخدم بنقاط تعداد، وهو أمر مناسب لكلمات المرور.

احفظ مشروعك (باستخدام ضغطة المفتاح: command + s) التي تنفّذ إعادة تحميل سريعة.

من المفترض أن تظهر الآن صفحة تتضمّن حقلَين نصيَّين لاسم المستخدم وكلمة المرور. إليك طريقة عمل الصورة المتحركة للتصنيف العائم:

Android

iOS

شعار Shrine مع حقول اسم المستخدم وكلمة المرور

5- إضافة أزرار

بعد ذلك، سنضيف زرَّين إلى صفحة تسجيل الدخول: "إلغاء" و"التالي". سنستخدم نوعَين من عناصر واجهة المستخدم للأزرار: TextButton وElevatedButton.

إضافة OverflowBar

بعد الحقول النصية، أضِف OverflowBar إلى العناصر الفرعية في ListView:

// TODO: Add button bar (101)
OverflowBar(
  alignment: MainAxisAlignment.end,
  // TODO: Add a beveled rectangular border to CANCEL (103)
  children: <Widget>[
    // TODO: Add buttons (101)
  ],
),

يرتّب OverflowBar عناصره الثانوية في صف.

إضافة الأزرار

بعد ذلك، أضِف زرَّين إلى قائمة children في OverflowBar:

    // TODO: Add buttons (101)
    TextButton(
      child: const Text('CANCEL'),
      onPressed: () {
        // TODO: Clear the text fields (101)
      },
    ),
    // TODO: Add an elevation to NEXT (103)
    // TODO: Add a beveled rectangular border to NEXT (103)
    ElevatedButton(
      child: const Text('NEXT'),
      onPressed: () {
    // TODO: Show the next page (101) 
      },
    ),

احفظ مشروعك. أسفل حقل النص الأخير، من المفترض أن يظهر زرّان:

Android

iOS

شعار Shrine مع حقول اسم المستخدم وكلمة المرور وزرَّي الإلغاء والتالي

شعار Shrine مع حقول اسم المستخدم وكلمة المرور وزرَّي الإلغاء والتالي

يتولّى OverflowBar مهمة إنشاء التنسيق نيابةً عنك. يضع الأزرار أفقيًا، لذا تظهر جنبًا إلى جنب.

يؤدي لمس زر إلى بدء حركة تموّج الحبر بدون التسبّب في حدوث أي شيء آخر. لنضِف وظائف إلى دوال onPressed: المجهولة، بحيث يمحو زر الإلغاء حقول النص، ويغلق زر التالي الشاشة:

إضافة عناصر TextEditingController

لإتاحة محو قيم حقول النص، سنضيف TextEditingControllers للتحكّم في النص.

أسفل تعريف الفئة _LoginPageState مباشرةً، أضِف عناصر التحكّم كمتغيّرات final.

  // TODO: Add text editing controllers (101)
  final _usernameController = TextEditingController();
  final _passwordController = TextEditingController();

في حقل controller: الخاص بحقل النص الأول، اضبط _usernameController على:

// TODO: Add TextField widgets (101)
// [Name]
TextField(
  controller: _usernameController,

في حقل controller: الخاص بحقل النص الثاني، اضبط الآن _passwordController:

// TODO: Add TextField widgets (101)
// [Password]
TextField(
  controller: _passwordController,

تعديل onPressed

أضِف أمرًا لمحو كل أداة تحكّم في الدالة onPressed: الخاصة بـ TextButton:

    // TODO: Clear the text fields (101)
    _usernameController.clear();
    _passwordController.clear();

احفظ مشروعك. الآن، عند كتابة أي شيء في حقول النص، سيؤدي النقر على "إلغاء" إلى محو كل حقل مرة أخرى.

نموذج تسجيل الدخول هذا في حالة جيدة. لننتقل بالمستخدمين إلى بقية تطبيق Shrine.

تمييز

لإغلاق هذا العرض، نريد إزالة هذه الصفحة (التي يسمّيها Flutter مسارًا) من حزمة التنقّل.

في الدالة onPressed: الخاصة بـ ElevatedButton، أزِل أحدث مسار من Navigator:

        // TODO: Show the next page (101) 
        Navigator.pop(context);

أخيرًا، افتح home.dart واضبط resizeToAvoidBottomInset على false في Scaffold:

    return Scaffold(
      // TODO: Add app bar (102)
      // TODO: Add a grid view (102)
      body: Center(
        child: Text('You did it!'),
      ),
      // TODO: Set resizeToAvoidBottomInset (101)
      resizeToAvoidBottomInset: false,
    );

يضمن ذلك ألا يؤدي ظهور لوحة المفاتيح إلى تغيير حجم الصفحة الرئيسية أو أدواتها.

هذا كل شيء! احفظ مشروعك. انقر على "التالي".

أحسنت!

Android

iOS

شاشة تعرض الرسالة &quot;أحسنت&quot;

شاشة تعرض الرسالة &quot;أحسنت&quot;

هذه الشاشة هي نقطة البداية لدرسنا العملي التالي الذي ستعمل عليه في MDC-102.

6. تهانينا!

أضفنا حقولاً نصية وأزرارًا ولم نضطر إلى التفكير في رمز التصميم. تتضمّن Material Components for Flutter الكثير من الأنماط ويمكن وضعها على الشاشة بسهولة تامة.

الخطوات التالية

حقول النص والأزرار هما عنصران أساسيان في نظام Material، ولكن هناك العديد من العناصر الأخرى. يمكنك أيضًا استكشاف الباقي في كتالوج أدوات Material Components.

يمكنك بدلاً من ذلك الانتقال إلى MDC-102: بنية وتنسيق التصميم المتعدد الأبعاد للتعرّف على المكوّنات التي يغطيها MDC-102 في Flutter.

تمكّنتُ من إكمال هذا الدرس التطبيقي حول الترميز خلال فترة زمنية معقولة وبجهد معقول

أوافق بشدة أوافق لا أوافق ولا أعارض لا أوافق لا أوافق أبدًا

أريد مواصلة استخدام "مكوّنات Material" في المستقبل

أوافق بشدة أوافق لا أوافق ولا أعارض لا أوافق لا أوافق أبدًا