Membersihkan dengan finally
Termasuk bagian Data dan Jaringan dalam perjalanan Flutter di Coddy. Pelajaran 12 dari 27.
Beberapa pekerjaan harus dilakukan, baik pemanggilan berhasil maupun gagal: sembunyikan spinner, aktifkan kembali tombol. Menulisnya di try dan catch sama-sama mudah terlupakan di salah satunya. Dart memiliki blok ketiga untuk itu, yaitu finally:
try {
await saveName(name);
} catch (e) {
// tampilkan error
} finally {
// selalu dijalankan: setelah try atau setelah catch
}finally dijalankan paling akhir, setiap kali: setelah try jika berhasil, setelah catch jika gagal. Dengan begitu, blok ini menjadi satu-satunya tempat untuk membatalkan apa yang kamu siapkan sebelum pemanggilan.
Di sini, aplikasi membuat Simpan berwarna abu-abu saat menyimpan, dengan onPressed: saving ? null : save. Tombol yang onPressed-nya bernilai null tidak dapat ditekan. Jika saving tidak pernah kembali ke false, tombol akan terus berwarna abu-abu.
Tantangan
SedangSimpan saat kolom kosong: error akan muncul, dan Save tetap berwarna abu-abu, sehingga kamu tidak bisa mencoba lagi. Pindahkan saving = false dari blok try ke blok finally, di dalam setState tersendiri.
Coba sendiri
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)),
],
),
),
);
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Data dan Jaringan
3Saat Pemanggilan Gagal
Menangkap Error dengan tryMelempar ErrorMembersihkan dengan finallyStatus Error FutureBuilderTombol Coba LagiLatihan sendiri: Compiler Flutter online