Lista delle cose da fare: niente attività vuote
Fa parte della sezione Progetti del percorso Flutter di Coddy. Lezione 5 di 36.
Tocca «Aggiungi» senza digitare nulla e nell’elenco compare una riga vuota. Digita solo spazi e ottieni una riga che sembra vuota. Le app reali rifiutano entrambi i casi e spiegano il motivo.
trim() restituisce il testo senza spazi all’inizio e alla fine. Se non rimane nulla, non c’è alcuna attività: mostra una SnackBar ed esegui return prima di aggiungere qualsiasi cosa.
final title = _controller.text.trim();
if (title.isEmpty) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Type a task first')),
);
return;
}Usa anche title per la nuova attività, così " Call mom " viene salvato come "Call mom".
Un return anticipato come questo viene chiamato guardia. Mantiene il caso non valido all’inizio, così il resto della funzione gestisce solo input validi.
Sfida
MedioRifiuta le attività vuote in _addTask:
- leggi il campo usando
trim() - se non resta nulla, mostra una
SnackBarcon il messaggioType a task firste non aggiungere nulla - altrimenti aggiungi il titolo senza spazi iniziali o finali
Provalo tu
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.teal),
),
home: const TodoScreen(),
);
}
}
class Task {
Task(this.title);
final String title;
bool done = false;
}
class TodoScreen extends StatefulWidget {
const TodoScreen({super.key});
@override
State<TodoScreen> createState() => _TodoScreenState();
}
class _TodoScreenState extends State<TodoScreen> {
final List<Task> _tasks = [Task('Buy milk'), Task('Walk the dog'), Task('Read a book')];
final _controller = TextEditingController();
int get _left => _tasks.where((task) => !task.done).length;
void _addTask() {
setState(() {
_tasks.add(Task(_controller.text));
});
_controller.clear();
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('My Tasks')),
body: Column(
children: [
Padding(
padding: const EdgeInsets.fromLTRB(16, 16, 16, 8),
child: Row(
children: [
Expanded(
child: TextField(
controller: _controller,
decoration: const InputDecoration(
labelText: 'New task',
border: OutlineInputBorder(),
),
),
),
const SizedBox(width: 8),
IconButton.filled(
onPressed: _addTask,
icon: const Icon(Icons.add),
),
],
),
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
child: Row(
children: [
Text(
_left == 1 ? '1 task left' : '$_left tasks left',
style: Theme.of(context).textTheme.titleSmall,
),
],
),
),
Expanded(
child: ListView.builder(
itemCount: _tasks.length,
itemBuilder: (context, index) {
final task = _tasks[index];
return ListTile(
leading: Checkbox(
value: task.done,
onChanged: (value) {
setState(() {
task.done = value!;
});
},
),
title: Text(
task.title,
style: task.done
? const TextStyle(
decoration: TextDecoration.lineThrough,
color: Colors.grey,
)
: null,
),
);
},
),
),
],
),
);
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Progetti
1Progetto: Lista delle cose da fare
Lista delle cose da fare: l’elenco delle attivitàLista delle cose da fare: aggiungere un’attività4Progetto: Tracker delle abitudini
Tracker delle abitudini: le tue abitudiniTracker delle abitudini: la settimanaEsercitati da solo: Compilatore Flutter online