MDC-101 Flutter: nozioni di base sui componenti dei materiali

1. Introduzione

Che cosa sono Material Design e la libreria Material Flutter?

Material Design è un sistema per creare prodotti digitali audaci e belli. Unendo stile, branding, interazione e movimento in un insieme coerente di principi e componenti, i team di prodotto possono realizzare il loro massimo potenziale di progettazione.

La libreria Material Flutter include widget Flutter che implementano i design dei componenti Material Design (MDC in breve) per creare un'esperienza utente coerente su app e piattaforme. Man mano che il sistema Material Design si evolve, questi componenti vengono aggiornati per garantire un'implementazione coerente e perfetta al pixel, rispettando gli standard di sviluppo front-end di Google.

In questo codelab, creerai una pagina di accesso utilizzando diversi componenti di Material Flutter.

Cosa creerai

Questo codelab è il primo di quattro che ti guideranno nella creazione di un'app chiamata Shrine, un'app di e-commerce che vende abbigliamento e articoli per la casa. Mostrerà come personalizzare i componenti in modo che riflettano qualsiasi brand o stile utilizzando Material Flutter.

In questo codelab, creerai una pagina di accesso per Shrine che contiene:

  • Un'immagine del logo di Shrine
  • Il nome dell'app (Shrine)
  • Due campi di testo, uno per inserire un nome utente e l'altro per una password
  • Due pulsanti

Android

iOS

Pagina di accesso al santuario su Android

Pagina di accesso al santuario su iOS

Componenti e sottosistemi Material Flutter in questo codelab

  • Campo di testo
  • Pulsante
  • Ondulazione dell'inchiostro (una forma visiva di feedback per gli eventi touch)

Come valuteresti il tuo livello di esperienza con lo sviluppo Flutter?

Principiante Intermedio Avanzato

2. Configura l'ambiente di sviluppo Flutter

Per completare questo lab, hai bisogno di due software: l'SDK Flutter e un editor.

Puoi eseguire il codelab utilizzando uno qualsiasi di questi dispositivi:

  • Un dispositivo fisico Android o iOS connesso al computer e impostato sulla modalità sviluppatore.
  • Il simulatore iOS (richiede l'installazione degli strumenti Xcode).
  • L'emulatore Android (richiede la configurazione in Android Studio).
  • Un browser (Chrome è necessario per il debug).
  • Come applicazione desktop Windows, Linux o macOS. Devi sviluppare sulla piattaforma in cui prevedi di eseguire il deployment. Pertanto, se vuoi sviluppare un'app desktop Windows, devi svilupparla su Windows per accedere alla catena di build appropriata. Esistono requisiti specifici del sistema operativo trattati in dettaglio su docs.flutter.dev/desktop.

3. Scarica l'app iniziale del codelab

Il progetto iniziale si trova nella directory material-components-flutter-codelabs-101-starter/mdc_100_series.

...o clonalo da GitHub

Per clonare questo codelab da GitHub, esegui i seguenti comandi:

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

Apri il progetto ed esegui l'app

  1. Apri il progetto nell'editor che preferisci.
  2. Segui le istruzioni per "Eseguire l'app" nella sezione Guida rapida: prova per l'editor che hai scelto.

Operazione riuscita. Il codice iniziale per la pagina di accesso di Shrine dovrebbe essere in esecuzione sul tuo dispositivo. Dovresti vedere il logo di Shrine e il nome "Shrine" appena sotto.

Android

iOS

Logo Shrine

Logo Shrine

Diamo un'occhiata al codice.

Widget in login.dart

Apri login.dart. Deve contenere:

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

Tieni presente che contiene un'istruzione import e due nuove classi:

  • L'istruzione import consente di utilizzare la libreria Material in questo file.
  • La classe LoginPage rappresenta l'intera pagina visualizzata nel simulatore.
  • La funzione build() della classe _LoginPageState controlla la modalità di creazione di tutti i widget nella nostra UI.

4. Aggiungere widget TextField

Per iniziare, aggiungiamo due campi di testo alla nostra pagina di accesso, in cui gli utenti inseriscono il nome utente e la password. Utilizzeremo il widget TextField, che mostra un'etichetta mobile e attiva un'increspatura al tocco.

Questa pagina è strutturata principalmente con un ListView, che dispone i suoi elementi secondari in una colonna scorrevole. Inseriamo i campi di testo di seguito.

Aggiungere i widget TextField

Aggiungi due nuovi campi di testo e uno spazio dopo 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,
),

I campi di testo hanno un campo decoration: che accetta un widget InputDecoration. Il campo filled: indica che lo sfondo del campo di testo è leggermente riempito per aiutare gli utenti a riconoscere l'area di tocco o di selezione del campo di testo. Il valore obscureText: true del secondo campo di testo sostituisce automaticamente l'input digitato dall'utente con dei punti elenco, il che è appropriato per le password.

Salva il progetto (con la combinazione di tasti Comando + S), che esegue un Hot Reload.

A questo punto dovresti visualizzare una pagina con due campi di testo per nome utente e password. Guarda l'animazione dell'etichetta mobile:

Android

iOS

Logo di Shrine con i campi per il nome utente e la password

5. Aggiungere pulsanti

A questo punto, aggiungeremo due pulsanti alla nostra pagina di accesso: "Annulla" e "Avanti". Utilizzeremo due tipi di widget pulsante: TextButton ed ElevatedButton.

Aggiungere OverflowBar

Dopo i campi di testo, aggiungi OverflowBar ai figli di 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 dispone i suoi elementi secondari in una riga.

Aggiungere i pulsanti

Quindi, aggiungi due pulsanti all'elenco di children di 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) 
      },
    ),

Salvare il progetto. Sotto l'ultimo campo di testo, dovresti vedere due pulsanti:

Android

iOS

Logo del santuario con campi per nome utente e password, pulsanti Annulla e Avanti

Logo del santuario con campi per nome utente e password, pulsanti Annulla e Avanti

OverflowBar si occupa del layout per te. Dispone i pulsanti orizzontalmente, in modo che vengano visualizzati uno accanto all'altro.

Se tocchi un pulsante, si avvia un'animazione a increspatura di inchiostro, senza che accada altro. Aggiungiamo funzionalità alle funzioni onPressed: anonime, in modo che il pulsante Annulla cancelli i campi di testo e il pulsante Avanti chiuda la schermata:

Aggiungere TextEditingController

Per consentire la cancellazione dei valori dei campi di testo, aggiungeremo TextEditingControllers per controllare il testo.

Subito sotto la dichiarazione della classe _LoginPageState, aggiungi i controller come variabili final.

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

Nel campo controller: del primo campo di testo, imposta _usernameController:

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

Nel campo controller: del secondo campo di testo, imposta ora _passwordController:

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

Edit onPressed

Aggiungi un comando per cancellare ogni controller nella funzione onPressed: di TextButton:

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

Salvare il progetto. Ora, quando digiti qualcosa nei campi di testo, se premi Annulla, ogni campo viene cancellato di nuovo.

Questo modulo di accesso è in buone condizioni. Passiamo al resto dell'app Shrine.

Vivace

Per chiudere questa visualizzazione, vogliamo rimuovere (o eliminare) questa pagina (che Flutter chiama route) dallo stack di navigazione.

Nella funzione onPressed: di ElevatedButton, estrai l'ultima route da Navigator:

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

Infine, apri home.dart e imposta resizeToAvoidBottomInset su false in 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,
    );

In questo modo, l'aspetto della tastiera non altera le dimensioni della home page o dei relativi widget.

È tutto. Salvare il progetto. Fai clic su "Avanti".

Ce l'hai fatta!

Android

iOS

schermata con il messaggio &quot;Ce l&#39;hai fatta&quot;

schermata con il messaggio &quot;Ce l&#39;hai fatta&quot;

Questa schermata è il punto di partenza del nostro prossimo codelab, su cui lavorerai in MDC-102.

6. Complimenti!

Abbiamo aggiunto campi di testo e pulsanti e non abbiamo quasi dovuto considerare il codice di layout. I componenti Material per Flutter hanno molto stile e possono essere posizionati sullo schermo quasi senza sforzo.

Passaggi successivi

I campi di testo e i pulsanti sono due componenti principali del sistema Material, ma ce ne sono molti altri. Puoi esplorare il resto nel catalogo dei widget dei componenti Material.

In alternativa, vai a MDC-102: Material Design Structure and Layout per scoprire i componenti trattati in MDC-102 per Flutter.

Sono riuscito a completare questo codelab con un ragionevole dispendio di tempo e impegno

Totalmente d'accordo D'accordo Indifferente In disaccordo Totalmente in disaccordo

Vorrei continuare a utilizzare i componenti Material in futuro

Totalmente d'accordo D'accordo Indifferente In disaccordo Totalmente in disaccordo