1. מבוא
מהם Material Design וספריית Material Flutter?
Material Design היא מערכת ליצירת מוצרים דיגיטליים מרשימים ויפים. צוותי המוצר יכולים לממש את פוטנציאל העיצוב הגדול ביותר שלהם על ידי איחוד של סגנון, מיתוג, אינטראקציה ותנועה תחת מערכת עקרונות ורכיבים עקבית.
הספרייה Material Flutter כוללת ווידג'טים של Flutter שמטמיעים את העיצובים של רכיבי Material Design (MDC בקיצור) כדי ליצור חוויית משתמש עקבית באפליקציות ובפלטפורמות. מערכת Material Design מתפתחת, ולכן הרכיבים האלה מתעדכנים כדי להבטיח הטמעה עקבית ברמת הפיקסל, בהתאם לתקנים של Google לפיתוח חזיתי.
ב-codelab הזה תלמדו איך ליצור דף כניסה באמצעות כמה רכיבים של Material Flutter.
מה תפַתחו
ה-codelab הזה הוא הראשון מתוך ארבעה שיעזרו לכם ליצור אפליקציה בשם Shrine, אפליקציית מסחר אלקטרוני למכירת בגדים ומוצרים לבית. המאמר יראה לכם איך להתאים אישית רכיבים כדי לשקף מותג או סגנון כלשהו באמצעות Material Flutter.
ב-codelab הזה תיצרו דף כניסה לאפליקציית Shrine, שיכלול:
- תמונה של הלוגו של Shrine
- שם האפליקציה (Shrine)
- שני שדות טקסט, אחד להזנת שם משתמש והשני להזנת סיסמה
- שני לחצנים
Android | iOS |
|
|
רכיבים ותת-מערכות של Material Flutter במעבדת התכנות הזו
- שדה טקסט
- כפתור
- אדוות דיו (משוב ויזואלי לאירועי מגע)
איך היית מדרג את רמת הניסיון שלך בפיתוח ב-Flutter?
2. הגדרת סביבת הפיתוח של Flutter
כדי להשלים את שיעור ה-Lab הזה, תצטרכו שני סוגי תוכנה: Flutter SDK ועורך.
אפשר להריץ את ה-codelab באמצעות כל אחד מהמכשירים הבאים:
- מכשיר פיזי עם Android או iOS שמחובר למחשב ומוגדר למצב פיתוח.
- סימולטור iOS (נדרשת התקנה של כלי Xcode).
- אמולטור Android (נדרשת הגדרה ב-Android Studio).
- דפדפן (חובה להשתמש ב-Chrome לצורך ניפוי באגים).
- כאפליקציה למחשב Windows, Linux או macOS. אתם צריכים לפתח בפלטפורמה שבה אתם מתכננים לבצע פריסה. לכן, אם רוצים לפתח אפליקציה למחשב שולחני עם Windows, צריך לפתח ב-Windows כדי לגשת לשרשרת הבנייה המתאימה. יש דרישות ספציפיות למערכות הפעלה שמוסברות בפירוט במאמר docs.flutter.dev/desktop.
3. הורדת אפליקציה לתחילת הדרך של ה-Codelab
פרויקט המתחילים נמצא בספרייה material-components-flutter-codelabs-101-starter/mdc_100_series.
...או לשכפל אותו מ-GitHub
כדי לשכפל את ה-codelab הזה מ-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
פותחים את הפרויקט ומריצים את האפליקציה
- פותחים את הפרויקט בכלי העריכה הרצוי.
- פועלים לפי ההוראות שבקטע תחילת העבודה: ניסיון נסיעה כדי להפעיל את האפליקציה בעורך שבחרתם.
הצלחת! קוד לתחילת הדרך של דף הכניסה של Shrine צריך לפעול במכשיר שלכם. הלוגו של Shrine והשם Shrine יופיעו מתחתיו.
Android | iOS |
|
|
בואו נסתכל על הקוד.
ווידג'טים ב- 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מייצגות את כל הדף שמוצג בסימולטור. - הפונקציה
_LoginPageStateclass'sbuild()שולטת באופן שבו נוצרים כל הווידג'טים בממשק המשתמש שלנו.
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) ומבצעים טעינה מחדש.
עכשיו אמור להופיע דף עם שני שדות טקסט: Username (שם משתמש) ו-Password (סיסמה). כדאי לבדוק את האנימציה של התווית הצפה:
Android | iOS |
|
|
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 |
|
|
OverflowBar מטפל בעבודת הפריסה בשבילכם. הוא ממקם את הלחצנים בצורה אופקית, כך שהם מופיעים זה לצד זה.
כשנוגעים בלחצן, מופעלת אנימציה של אדוות דיו, בלי שקורה משהו אחר. נוסיף פונקציונליות לפונקציות האנונימיות onPressed:, כך שכפתור הביטול ינקה את שדות הטקסט וכפתור ההמשך יסגור את המסך:
הוספת TextEditingControllers
כדי לאפשר ניקוי של ערכי שדות הטקסט, נוסיף 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 route) ממערך הניווט.
בפונקציה 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 |
|
|
המסך הזה הוא נקודת ההתחלה של ה-Codelab הבא שלנו, שתעבדו עליו ב-MDC-102.
6. מעולה!
הוספנו שדות טקסט ולחצנים, וכמעט לא היה צורך להתייחס לקוד הפריסה. רכיבי Material ל-Flutter מגיעים עם הרבה סגנונות, ואפשר להציב אותם במסך כמעט ללא מאמץ.
השלבים הבאים
שדות טקסט וכפתורים הם שני רכיבי ליבה במערכת Material, אבל יש עוד הרבה רכיבים! אפשר גם לעיין בשאר הרכיבים בקטלוג הווידג'טים של Material Components.
אפשר גם לעבור אל MDC-102: Material Design Structure and Layout כדי לקבל מידע על הרכיבים שמוסברים ב-MDC-102 ל-Flutter.









