Yapılacaklar Listesi: Boş Görev Yok
Coddy'nin Flutter Journey'sinin Projeler bölümünün bir parçası. Ders 5 / 36.
Hiçbir şey yazmadan ekle'ye dokunursan listen boş bir satır alır. Yalnızca boşluk yazarsan yine boş görünen bir satır alırsın. Gerçek uygulamalar her iki durumu da reddeder ve nedenini açıklar.
trim(), başındaki ve sonundaki boşluklar olmadan metni döndürür. Geriye hiçbir şey kalmazsa görev yok demektir: bir SnackBar göster ve herhangi bir şey eklenmeden önce return ile çık.
final title = _controller.text.trim();
if (title.isEmpty) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Type a task first')),
);
return;
}Yeni görev için de title kullan; böylece " Call mom ", "Call mom" olarak kaydedilir.
Bunun gibi erken bir return koruma olarak adlandırılır. Hatalı durumu en başta ele alır ve fonksiyonun geri kalanının yalnızca geçerli girdiyle ilgilenmesini sağlar.
Görev
Orta_addTask içinde boş görevleri reddet:
- alanı
trim()ile oku - geriye hiçbir şey kalmadığında,
SnackBariçindeType a task firstmesajını göster ve hiçbir şey ekleme - aksi takdirde, başlığın boşlukları temizlenmiş hâlini ekle
Kendin dene
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,
),
);
},
),
),
],
),
);
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Projeler bölümündeki tüm dersler
1Proje: Yapılacaklar Listesi
Yapılacaklar Listesi: Görev ListesiYapılacaklar Listesi: Görev Ekleme4Proje: Alışkanlık Takipçisi
Alışkanlık Takipçisi: AlışkanlıklarınAlışkanlık Takipçisi: HaftaKendi başına pratik yap: Online Flutter derleyicisi