Tambahkan nama panggilan Anda pada title app sebagai identitas hasil pekerjaan Anda
cobalah akses di browser URI tersebut dengan lengkap seperti ini. Jika menampilkan data JSON, maka Anda telah berhasi
Jelaskan maksud kode langkah 5 tersebut terkait substring dan catchError!
-substring : Untuk mencegah tampilan teks terlalu panjang di layar saat menampilkan hasil dari API. Karena hasil Google Books API biasanya sangat panjang (ratusan baris JSON), jadi cukup ditampilkan sebagian
-catchError : digunakan untuk menangani error jika proses getData() gagal — misalnya: Tidak ada koneksi internet, URL salah,Server API down
-setState : digunakan untuk memperbarui tampilan (UI) setiap kali nilai result berubah — baik saat sukses maupun error. Flutter akan me-render ulang Text(result) di layar dengan isi terbaru
substring(0, 450) membatasi teks dari hasil API supaya tidak terlalu panjang. catchError menangkap dan menampilkan pesan error jika permintaan API gagal
method async :
tiga method asynchronous (returnOneAsync, returnTwoAsync, dan returnThreeAsync). Masing-masing method menggunakan Future.delayed selama tiga detik untuk mensimulasikan proses yang memerlukan waktu, seperti mengambil data dari server. Setelah waktu tunggu selesai, setiap method akan mengembalikan nilai bilangan bulat (1, 2, dan 3)
method count : Di dalamnya terdapat variabel total yang digunakan untuk menampung hasil penjumlahan dari ketiga method sebelumnya. Prosesnya dilakukan secara berurutan menggunakan await, sehingga program akan menunggu setiap method selesai dijalankan sebelum melanjutkan ke berikutnya. Setelah ketiganya selesai, total hasil dijumlahkan menjadi 6 dan kemudian ditampilkan pada antarmuka pengguna melalui setState().
Jelaskan maksud kode langkah 2 tersebut!:
berfungsi untuk membuat proses asynchronous menggunakan Completer, yang memungkinkan kita mengontrol kapan sebuah Future dianggap selesai. Variabel completer menyimpan objek Completer yang nantinya menghasilkan nilai berupa angka. Fungsi getNumber() memanggil calculate(), lalu mengembalikan Future dari completer. Sementara itu, fungsi calculate() menunda eksekusi selama 5 detik menggunakan Future.delayed(), kemudian menyelesaikan Future dengan memberikan nilai 42 melalui completer.complete(42). Hasilnya, setelah 5 detik, nilai 42 akan dikembalikan dan bisa ditampilkan ke layar.
Jelaskan maksud perbedaan kode langkah 2 dengan langkah 5-6 tersebut!
-Pada langkah 2, kode hanya menjalankan proses asynchronous dengan Completer, menunggu 5 detik, lalu mengembalikan nilai 42 tanpa memeriksa kemungkinan error.
-Sedangkan pada langkah 5–6, kode menambahkan blok try-catch untuk menangkap error selama proses Future.delayed, dan jika terjadi kesalahan, completer.completeError() dijalankan agar error dapat diteruskan ke .catchError() pada pemanggilan getNumber(). Dengan begitu, aplikasi menjadi lebih aman dan terkontrol karena mampu menampilkan pesan kesalahan jika terjadi error.
Capture hasil praktikum Anda berupa GIF dan lampirkan di README. Lalu lakukan commit dengan pesan "W11: Soal 7".
Jelaskan maksud perbedaan kode langkah 1 dan 4!
-Perbedaan antara langkah 1 dan langkah 4 terletak pada cara menunggu proses asynchronous secara bersamaan. Pada langkah 1, kode menggunakan FutureGroup dari package eksternal async, di mana setiap future harus ditambahkan satu per satu menggunakan add() dan ditutup dengan close() sebelum hasilnya diproses. Sementara pada langkah 4, kode menggunakan Future.wait yang merupakan fitur bawaan Dart, cukup dengan memberikan daftar future di dalam list untuk dijalankan secara paralel tanpa perlu menutup atau menambahkannya manual.
Capture hasil praktikum Anda berupa GIF dan lampirkan di README. Lalu lakukan commit dengan pesan "W11: Soal 9".
Panggil method handleError() tersebut di ElevatedButton, lalu run. Apa hasilnya? Jelaskan perbedaan kode langkah 1 dan 4!
-Muncul exception something teribble happened
Langkah 1 Ini adalah fungsi yang menghasilkan error secara sengaja.
Setelah menunggu 2 detik (Future.delayed), fungsi ini melempar Exception.
Jadi, returnError() hanya bertugas mensimulasikan error dari operasi asynchronous
Langkah 4
Ini adalah fungsi yang memanggil returnError() dan menangani error-nya.
try menjalankan returnError().
catch menangkap exception dari returnError() dan menampilkannya ke UI (setState).
finally dijalankan selalu, entah sukses atau gagal (di sini hanya print 'Complete')
Tambahkan nama panggilan Anda pada tiap properti title sebagai identitas pekerjaan Anda.
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Current Location - Erwan Majid 06')),
body: Center(child: Text(myPosition)),
);
}
Apakah Anda mendapatkan koordinat GPS ketika run di browser? Mengapa demikian?
-Mendapatkan koordinat, karena browser meminta akses lokasi kepada kita, dan di allow
Apakah ada perbedaan UI dengan praktikum sebelumnya? Mengapa demikian?
-Ada, karena versi ini menampilkan indikator loading sebelum menampilkan hasil lokasi, sedangkan praktikum sebelumnya langsung menampilkan data tanpa proses tunggu. Hal ini terjadi karena pada praktikum ini digunakan Future, proses asynchronous, dan FutureBuilder untuk merender tampilan berdasarkan status Future.
Apakah ada perbedaan UI dengan langkah sebelumnya? Mengapa demikian?
-UI berbeda karena kini error ditangani. FutureBuilder menampilkan UI sesuai state Future, sehingga penambahan blok snapshot.hasError menghasilkan tampilan baru ketika terjadi kesalahan
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text(' Erwan Majid 06 Navigation Second Screen'),
),
body: Center(
child: ElevatedButton(
child: const Text('Pick yellow Color'),
onPressed: () {
Navigator.pop(context, Colors.yellow);
},
),
),
);
Cobalah klik setiap button, apa yang terjadi ? Mengapa demikian ?
Setiap tombol di halaman kedua akan mengembalikan data warna ke halaman pertama, membuat background halaman pertama berubah. Ini bisa terjadi karena kombinasi penggunaan:
Navigator.push() berpindah halaman dan menunggu data
Navigator.pop() kembali ke halaman sebelumnya sambil mengirimkan data
setState() memperbarui tampilan setelah data diterima
Cobalah klik setiap button, apa yang terjadi ? Mengapa demikian ?
-Ketika tombol Change Color ditekan, aplikasi menampilkan sebuah dialog yang berisi tiga tombol pilihan warna, yaitu Red, Green, dan Blue_gray. Ketika salah satu tombol tersebut diklik, dialog akan tertutup dan warna background halaman utama akan berubah sesuai warna yang dipilih. Hal ini terjadi karena setiap tombol di dalam dialog mengubah nilai variabel color dan kemudian memanggil Navigator.pop() untuk menutup dialog sambil mengirimkan nilai tersebut kembali ke halaman utama. Setelah dialog tertutup, method _showColorDialog() menjalankan setState(), sehingga Flutter melakukan rebuild tampilan. Karena variabel color sudah diperbarui, background halaman otomatis berubah mengikuti warna yang dipilih pengguna
Gantilah 3 warna pada langkah 3 dengan warna favorit Anda!
extButton(
child: const Text('Red'),
onPressed: () {
color = Colors.red.shade700;
Navigator.pop(context, color);
},
),
TextButton(
child: const Text('Green'),
onPressed: () {
color = Colors.green.shade700;
Navigator.pop(context, color);
},
),
TextButton(
child: const Text('Blue Gray'),
onPressed: () {
color = Colors.blueGrey;
Navigator.pop(context, color);
},
),












