Menu
CoddyTech

To-do-Liste: Keine leeren Aufgaben

Teil des Abschnitts Projekte der Flutter-Journey von Coddy. Lektion 5 von 36.

Tippe auf „Hinzufügen“, ohne etwas einzugeben, und deine Liste bekommt eine leere Zeile. Gib nur Leerzeichen ein, erhältst du ebenfalls eine Zeile, die leer aussieht. Echte Apps weisen beides zurück und erklären warum.

trim() gibt den Text ohne Leerzeichen am Anfang und Ende zurück. Wenn nichts übrig bleibt, gibt es keine Aufgabe: Zeige eine SnackBar an und führe return aus, bevor etwas hinzugefügt wird.

final title = _controller.text.trim();
if (title.isEmpty) {
  ScaffoldMessenger.of(context).showSnackBar(
    const SnackBar(content: Text('Type a task first')),
  );
  return;
}

Verwende auch für die neue Aufgabe title, damit " Call mom " als "Call mom" gespeichert wird.

Ein vorzeitiges return wie dieses wird Guard genannt. Es hält den ungültigen Fall ganz oben, und der restliche Teil der Funktion verarbeitet nur gültige Eingaben.

challenge icon

Aufgabe

Mittel

Lehne leere Aufgaben in _addTask ab:

  • Lies das Feld mit trim() aus.
  • Wenn nichts übrig bleibt, zeige eine SnackBar mit der Meldung Type a task first an und füge nichts hinzu.
  • Andernfalls füge den gekürzten Titel hinzu.

Probier es selbst

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,
                  ),
                );
              },
            ),
          ),
        ],
      ),
    );
  }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Projekte

Übe selbstständig: Online-Flutter-Compiler