MDC-101 Flutter: podstawy komponentów materiałowych

1. Wprowadzenie

Czym są Material Design i biblioteka Material Flutter?

Material Design to system tworzenia atrakcyjnych i funkcjonalnych produktów cyfrowych. Łącząc styl, branding, interakcje i ruch w spójny zestaw zasad i komponentów, zespoły produktowe mogą w pełni wykorzystać swój potencjał projektowy.

Biblioteka Material Flutter zawiera widżety Fluttera, które implementują projekty komponentów Material Design (w skrócie MDC), aby zapewnić spójny interfejs użytkownika w aplikacjach i na platformach. Wraz z rozwojem systemu Material Design te komponenty są aktualizowane, aby zapewnić spójną implementację z dokładnością do piksela, zgodnie ze standardami Google dotyczącymi tworzenia interfejsu.

W tym ćwiczeniu utworzysz stronę logowania za pomocą kilku komponentów Material Flutter.

Co utworzysz

Te warsztaty to pierwsze z 4 szkoleń, które pomogą Ci w utworzeniu aplikacji Shrine – aplikacji e-commerce do sprzedaży odzieży i artykułów gospodarstwa domowego. Pokazujemy, jak dostosować komponenty, aby odzwierciedlały dowolną markę lub styl za pomocą Material Flutter.

W tym ćwiczeniu utworzysz stronę logowania do aplikacji Shrine, która będzie zawierać:

  • Obraz logo Shrine
  • Nazwa aplikacji (Shrine)
  • Dwa pola tekstowe: jedno do wpisania nazwy użytkownika, a drugie do wpisania hasła.
  • 2 przyciski

Android

iOS

Strona logowania Shrine na Androidzie

Strona logowania do Shrine na iOS

Komponenty i podsystemy Material Flutter w tym laboratorium

  • Pole tekstowe
  • Przycisk
  • Efekt fali atramentu (wizualna forma potwierdzenia zdarzeń dotknięcia)

Jak oceniasz swój poziom doświadczenia w programowaniu w Flutterze?

Początkujący Średnio zaawansowany Zaawansowany

2. Konfigurowanie środowiska programistycznego Fluttera

Aby ukończyć ten moduł, potrzebujesz 2 programów: pakietu SDK Flutteredytora.

Codelab możesz uruchomić na dowolnym z tych urządzeń:

  • fizyczne urządzenie z Android lub iOS podłączone do komputera i ustawione w trybie deweloperskim;
  • Symulator iOS (wymaga zainstalowania narzędzi Xcode).
  • Android Emulator (wymaga konfiguracji w Android Studio).
  • przeglądarka (do debugowania wymagana jest Chrome);
  • Jako aplikacja komputerowa na Windows, Linux lub macOS. Musisz tworzyć aplikację na platformie, na której zamierzasz ją wdrożyć. Jeśli chcesz opracować aplikację na komputery z systemem Windows, musisz to zrobić na komputerze z tym systemem, aby mieć dostęp do odpowiedniego łańcucha kompilacji. Istnieją wymagania dotyczące poszczególnych systemów operacyjnych, które są szczegółowo opisane na stronie docs.flutter.dev/desktop.

3. Pobierz aplikację startową do ćwiczeń z programowania

Projekt początkowy znajduje się w katalogu material-components-flutter-codelabs-101-starter/mdc_100_series.

...lub sklonuj go z GitHub

Aby skopiować ten codelab z GitHuba, uruchom te polecenia:

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

Otwórz projekt i uruchom aplikację

  1. Otwórz projekt w wybranym edytorze.
  2. Postępuj zgodnie z instrukcjami w sekcji „Uruchamianie aplikacji” w artykule Wprowadzenie: testowanie dotyczącym wybranego edytora.

Gotowe! Kod startowy strony logowania Shrine powinien być uruchomiony na Twoim urządzeniu. Powinno się wyświetlić logo Shrine i nazwa „Shrine” tuż pod nim.

Android

iOS

Logo Shrine

Logo Shrine

Przyjrzyjmy się kodowi.

Widżety w login.dart

Otwórz login.dart. Powinien zawierać te informacje:

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)
          ],
        ),
      ),
    );
  }
}

Zwróć uwagę, że zawiera on instrukcję import i 2 nowe klasy:

  • Instrukcja import umożliwia korzystanie z biblioteki Material w tym pliku.
  • Klasa LoginPage reprezentuje całą stronę wyświetlaną w symulatorze.
  • Funkcja _LoginPageState klasy build() określa sposób tworzenia wszystkich widżetów w naszym interfejsie.

4. Dodawanie widżetów TextField

Na początek dodamy do strony logowania 2 pola tekstowe, w których użytkownicy będą wpisywać nazwę użytkownika i hasło. Użyjemy widżetu TextField, który wyświetla pływającą etykietę i aktywuje efekt fali po dotknięciu.

Ta strona jest zbudowana głównie z użyciem widżetu ListView, który rozmieszcza elementy podrzędne w kolumnie z możliwością przewijania. Umieśćmy pola tekstowe poniżej.

Dodaj widżety TextField

Po polu const SizedBox(height: 120.0) dodaj 2 nowe pola tekstowe i spację.

// 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,
),

Każde pole tekstowe ma pole decoration:, które przyjmuje widżet InputDecoration. Pole filled: oznacza, że tło pola tekstowego jest lekko wypełnione, aby ułatwić użytkownikom rozpoznanie docelowego elementu dotykowego pola tekstowego. Wartość obscureText: true w drugim polu tekstowym automatycznie zastępuje wpisywane przez użytkownika znaki kropkami, co jest odpowiednie w przypadku haseł.

Zapisz projekt (za pomocą skrótu klawiszowego: command + s), co spowoduje szybkie ponowne wczytanie.

Powinna się teraz wyświetlić strona z 2 polami tekstowymi: Nazwa użytkownika i Hasło. Sprawdź animację etykiety pływającej:

Android

iOS

Logo świątyni z polami na nazwę użytkownika i hasło

5. Dodawanie przycisków

Następnie dodamy do strony logowania 2 przyciski: „Anuluj” i „Dalej”. Użyjemy 2 rodzajów widżetów przycisków: TextButtonElevatedButton.

Dodawanie paska OverflowBar

Po polach tekstowych dodaj OverflowBar do elementów podrzędnych 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)
  ],
),

Komponent OverflowBar rozmieszcza elementy podrzędne w rzędzie.

Dodawanie przycisków

Następnie dodaj 2 przyciski do listy children urządzenia 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) 
      },
    ),

Zapisz projekt. Pod ostatnim polem tekstowym powinny pojawić się 2 przyciski:

Android

iOS

Logo Shrine z polami nazwy użytkownika i hasła oraz przyciskami anulowania i dalej

Logo Shrine z polami nazwy użytkownika i hasła oraz przyciskami anulowania i dalej

OverflowBar zajmuje się układem za Ciebie. Ustawia przyciski w poziomie, dzięki czemu są wyświetlane obok siebie.

Dotknięcie przycisku powoduje animację rozchodzenia się atramentu, ale nie wywołuje żadnych innych działań. Dodajmy do funkcji anonimowych onPressed: funkcje, dzięki którym przycisk anulowania będzie czyścić pola tekstowe, a przycisk Dalej będzie zamykać ekran:

Dodawanie elementów TextEditingController

Aby umożliwić wyczyszczenie wartości pól tekstowych, dodamy TextEditingControllers do kontrolowania ich tekstu.

Bezpośrednio pod deklaracją klasy _LoginPageState dodaj kontrolery jako zmienne final.

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

W polu controller: pierwszego pola tekstowego ustaw _usernameController:

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

W polu controller: drugiego pola tekstowego ustaw teraz _passwordController:

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

Edytuj onPressed

Dodaj polecenie, aby wyczyścić każdy kontroler w funkcji onPressed: elementu TextButton:

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

Zapisz projekt. Teraz, gdy wpiszesz coś w polach tekstowych, naciśnięcie przycisku anulowania ponownie wyczyści każde pole.

Ten formularz logowania jest w dobrym stanie. Przekierujmy użytkowników do pozostałych części aplikacji Shrine.

Wyostrzenie

Aby zamknąć ten widok, musimy usunąć (lub zamknąć) tę stronę (którą Flutter nazywa trasą) ze stosu nawigacji.

W funkcji onPressed: ElevatedButton usuń z Navigatora ostatnią trasę:

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

Na koniec otwórz home.dart i ustaw resizeToAvoidBottomInset na falseScaffold:

    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,
    );

Dzięki temu wygląd klawiatury nie zmieni rozmiaru strony głównej ani jej widżetów.

To wszystko. Zapisz projekt. Kliknij „Dalej”.

Udało się!

Android

iOS

ekran z komunikatem „Udało się”

ekran z komunikatem „Udało się”

Ten ekran jest punktem początkowym do kolejnych zajęć z programowania, które odbędą się w ramach kursu MDC-102.

6. Gratulacje!

Dodaliśmy pola tekstowe i przyciski, a kod układu nie wymagał od nas większej uwagi. Komponenty Material Design dla Fluttera mają wiele stylów i można je umieszczać na ekranie niemal bez wysiłku.

Dalsze kroki

Pola tekstowe i przyciski to 2 główne komponenty systemu Material, ale jest ich znacznie więcej. Pozostałe znajdziesz w katalogu widżetów Material Components.

Możesz też zapoznać się z artykułem MDC-102: Struktura i układ Material Design, aby dowiedzieć się więcej o komponentach omówionych w MDC-102 dla Fluttera.

Udało mi się ukończyć to ćwiczenie w rozsądnym czasie i przy rozsądnym nakładzie pracy.

Zdecydowanie się zgadzam Zgadzam się Nie mam zdania Nie zgadzam się Zdecydowanie się nie zgadzam

Chcę nadal korzystać z komponentów Material

Zdecydowanie się zgadzam Zgadzam się Nie mam zdania Nie zgadzam się Zdecydowanie się nie zgadzam