1. Introduzione
Che cosa sono Material Design e la libreria Material Flutter?
Material Design è un sistema per la creazione di prodotti digitali audaci e accattivanti. 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 di 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 a livello di pixel, in conformità con 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. Ti mostrerà come personalizzare i componenti per riflettere 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 |
|
|
Componenti e sottosistemi di Material Flutter in questo codelab
- Campo di testo
- Pulsante
- Ripple di inchiostro (una forma visiva di feedback per gli eventi touch)
Come valuteresti il tuo livello di esperienza con lo sviluppo di Flutter?
2. Configurare l'ambiente di sviluppo di Flutter
Per completare questo laboratorio, sono necessari due software: Flutter SDK e un editor.
Puoi eseguire il codelab utilizzando uno di questi dispositivi:
- Un dispositivo fisico Android o iOS collegato al computer e impostato in modalità sviluppatore.
- Il simulatore iOS (richiede l'installazione degli strumenti Xcode).
- L' emulatore Android (richiede la configurazione in Android Studio).
- Un browser (Chrome è obbligatorio per il debug).
- Come applicazione desktop Windows, Linux o macOS. Devi sviluppare sulla piattaforma su cui prevedi di eseguire il deployment. Pertanto, se vuoi sviluppare un'app desktop Windows, devi sviluppare su Windows per accedere alla catena di build appropriata. Esistono requisiti specifici del sistema operativo che sono trattati in dettaglio all'indirizzo docs.flutter.dev/desktop.
3. Scaricare l'app di base del codelab
Il progetto di avvio 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
Aprire il progetto ed eseguire l'app
- Apri il progetto nell'editor che preferisci.
- Segui le istruzioni riportate in "Eseguire l'app" nella sezione Inizia: prova l'editor che hai scelto.
Operazione riuscita. Il codice di avvio 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 |
|
|
Diamo un'occhiata al codice.
Widget in login.dart
Apri login.dart. Dovrebbe contenere quanto segue:
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
importconsente di utilizzare la libreria Material in questo file. - La classe
LoginPagerappresenta l'intera pagina visualizzata nel simulatore. - La funzione
build()della classe_LoginPageStatecontrolla la modalità di creazione di tutti i widget nella nostra UI.
4. Aggiungere widget TextField
Per iniziare, aggiungeremo due campi di testo alla nostra pagina di accesso, in cui gli utenti inseriranno il nome utente e la password. Utilizzeremo il widget TextField, che mostra un'etichetta mobile e attiva un ripple touch.
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 spaziatore 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 ciascuno 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 destinazione del tocco del campo di testo. Il valore obscureText: true del secondo campo di testo sostituisce automaticamente l'input digitato dall'utente con dei punti, il che è appropriato per le password.
Salva il progetto (con la sequenza di tasti: comando + s) che esegue un ricaricamento rapido.
Ora dovresti vedere una pagina con due campi di testo per nome utente e password. Dai un'occhiata all'animazione dell'etichetta mobile:
Android | iOS |
|
|
5. Aggiungere pulsanti
Successivamente, aggiungeremo due pulsanti alla nostra pagina di accesso: "Annulla" e "Avanti". Utilizzeremo due tipi di widget pulsante: TextButton e ElevatedButton.
Aggiungere OverflowBar
Dopo i campi di testo, aggiungi OverflowBar agli elementi secondari 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 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)
},
),
Salva il progetto. Sotto l'ultimo campo di testo, dovresti vedere due pulsanti:
Android | iOS |
|
|
OverflowBar gestisce il lavoro di layout per te. Posiziona i pulsanti orizzontalmente, in modo che appaiano uno accanto all'altro.
Quando tocchi un pulsante, viene avviata un'animazione ripple di inchiostro, senza che accada nient'altro. Aggiungiamo funzionalità alle funzioni anonime onPressed:, 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 _passwordController:
// TODO: Add TextField widgets (101)
// [Password]
TextField(
controller: _passwordController,
Modificare onPressed
Aggiungi un comando per cancellare ogni controller nella funzione onPressed: di TextButton:
// TODO: Clear the text fields (101)
_usernameController.clear();
_passwordController.clear();
Salva 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. Facciamo avanzare i nostri utenti al resto dell'app Shrine.
Pop
Per chiudere questa visualizzazione, vogliamo estrarre (o rimuovere) questa pagina (che Flutter chiama route) dallo stack di navigazione.
Nella funzione onPressed: di ElevatedButton, estrai la route più recente 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 modifica le dimensioni della home page o dei relativi widget.
È tutto. Salva il progetto. Fai clic su "Avanti".
Ce l'hai fatta.
Android | iOS |
|
|
Questa schermata è il punto di partenza per il nostro prossimo codelab, su cui lavorerai in MDC-102.
6. Complimenti.
Abbiamo aggiunto campi di testo e pulsanti e non abbiamo dovuto considerare il codice di layout. I componenti di 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 anche esplorare il resto nel catalogo dei widget dei componenti di Material.
In alternativa, vai a MDC-102: struttura e layout di Material Design per scoprire i componenti trattati in MDC-102 per Flutter.









