Menu
CoddyTech

Melempar Error

Termasuk bagian Data dan Jaringan dalam perjalanan Flutter di Coddy. Pelajaran 11 dari 27.

Error tidak hanya terjadi pada server. Fungsi buatanmu sendiri juga bisa menolak untuk melanjutkan. Saat sebuah fungsi menerima sesuatu yang tidak bisa digunakannya, fungsi itu melempar error:

Future<void> saveName(String name) async {
  if (name.isEmpty) {
    throw Exception('The name cannot be empty');
  }
  // simpan nama
}

throw menghentikan fungsi saat itu juga, seperti return, tetapi mengembalikan error, bukan nilai. Exception('...') adalah error tersebut, dengan pesan yang menjelaskan apa yang salah.

Siapa pun yang memanggil fungsi menangkapnya dengan try dan catch, persis seperti error dari fetch. Saat diubah menjadi teks, Exception diawali dengan Exception: , lalu pesanmu.

Begitulah cara kerja fetch sungguhan. Setiap jawaban dari server disertai kode status: 200 berarti OK, 404 berarti tidak ditemukan. Jika bukan 200, kodemu melempar error, sehingga layar tidak pernah menampilkan jawaban yang rusak seolah-olah itu data:

final response = await http.get(Uri.parse(url));
if (response.statusCode != 200) {
  throw Exception('The server answered ${response.statusCode}');
}
return response.body;
challenge icon

Tantangan

Mudah

Ketuk Save saat kolom kosong: teks Saved: muncul tanpa nama. Buat saveName menolak nama kosong: setelah jeda, jika name kosong, lempar Exception('The name cannot be empty'). Fungsi save sudah menangkapnya dan menampilkan pesan.

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 = '';

  @override
  void dispose() {
    controller.dispose();
    super.dispose();
  }

  Future<void> saveName(String name) async {
    await Future.delayed(const Duration(seconds: 1));
  }

  Future<void> save() async {
    try {
      await saveName(controller.text);
      setState(() {
        status = 'Saved: ${controller.text}';
      });
    } 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: save, child: const Text('Save')),
            const SizedBox(height: 16),
            Text(status, style: const TextStyle(fontSize: 18)),
          ],
        ),
      ),
    );
  }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Data dan Jaringan

Latihan sendiri: Compiler Flutter online