finally ile Temizleme
Coddy'nin Flutter Journey'sinin Veri ve Ağ bölümünün bir parçası. Ders 12 / 27.
Bir çağrı başarılı olsa da başarısız olsa da bazı işler yapılmalıdır: dönen simgesini gizlemek, bir düğmeyi yeniden etkinleştirmek. Bunu hem try hem de catch içinde yazmak, birinde unutmayı kolaylaştırır. Dart bunun için üçüncü bir blok sunar: finally:
try {
await saveName(name);
} catch (e) {
// hatayı göster
} finally {
// her zaman çalışır: try sonrasında veya catch sonrasında
}finally her zaman en son çalışır: başarılı olduğunda try bloğundan sonra, başarısız olduğunda catch bloğundan sonra. Böylece çağrıdan önce ayarladıklarını geri almak için tek bir yer olur.
Burada uygulama, kaydetme işlemi sürerken Save düğmesini devre dışı bırakır; bunu onPressed: saving ? null : save ile yapar. onPressed değeri null olan bir düğmeye basılamaz. saving yeniden false değerine dönmezse düğme kalıcı olarak gri kalır.
Görev
OrtaAlan boşken kaydedin: hata görüntülenir ve Kaydet gri kalır, bu yüzden yeniden denemek mümkün olmaz. saving = false ifadesini try bloğunun dışına, kendi setState çağrısının içinde bir finally bloğuna taşıyın.
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 const MaterialApp(
debugShowCheckedModeBanner: false,
home: NameScreen(),
);
}
}
class NameScreen extends StatefulWidget {
const NameScreen({super.key});
@override
State<NameScreen> createState() => _NameScreenState();
}
class _NameScreenState extends State<NameScreen> {
final controller = TextEditingController();
String status = '';
bool saving = false;
@override
void dispose() {
controller.dispose();
super.dispose();
}
Future<void> saveName(String name) async {
await Future.delayed(const Duration(seconds: 1));
if (name.isEmpty) {
throw Exception('The name cannot be empty');
}
}
Future<void> save() async {
setState(() {
saving = true;
});
try {
await saveName(controller.text);
setState(() {
status = 'Saved: ${controller.text}';
saving = false;
});
} catch (e) {
setState(() {
status = '$e';
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Padding(
padding: const EdgeInsets.all(24),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextField(
controller: controller,
decoration: const InputDecoration(labelText: 'Name'),
),
const SizedBox(height: 16),
ElevatedButton(onPressed: saving ? null : save, child: const Text('Save')),
const SizedBox(height: 16),
Text(status, style: const TextStyle(fontSize: 18)),
],
),
),
);
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Veri ve Ağ bölümündeki tüm dersler
3Çağrılar Başarısız Olduğunda
try ile Hataları YakalamaHata Fırlatmafinally ile TemizlemeFutureBuilder Hata DurumuYeniden Dene DüğmesiKendi başına pratik yap: Online Flutter derleyicisi