Jelaskan apa yang dimaksud dengan stateless widget dan stateful widget dan jelaskan perbedaan dari keduanya.
Stateless Widget adalah sebagai Widget yang tidak dapat dirubah. Contohnya adalah navigasi karena konten navigasi tidak ada perubahan secara berkala
Stateful widget adalah widget yang dapat berubah. Contohnya adalah tampilan yang berubah atau warna text yang berubah. Pada widget ini dapat diterapkan setState.
- Scaffold: membuat tampilan dasar material design pada keseluruhan aplikasi
- FloatingActionButton: membuat button floating yang dapat ditekan dan menjalankan fungsi
- TextStyle: melakukan styling pada text
setState() yang akan bertugas untuk memberi tanda pada widget bahwa ada state yang berubah, yaitu dalam hal ini variabel _counter yang setiap kali tombol decrementCounter atau incrementCounter ditekan, maka nilai berubah.
Const tidak dapat diterapkan pada deklarasi sebuah variabel jika valuenya tidak diketahui saat compile, sedangkan final bisa diterapkan pada deklarasi variabel (baik yang nilainya sudah diketahui maupun belum) pada saat waktu kompilasi berjalan.
- Melakukan perintah flutter create app dan flutter run
- Menambahkan widget Padding dan FloatingActionButton agar dapat diletakkan di kiri bawah dan kanan bawah.
- Menambah variabel _counter dan useState untuk increment dan decrement
- Melakukan styling untuk tulisan ganjil/genap
- Menerapkan bonus dengan menerapkan if-else operator dan menambahkan remove pada button
Navigator.push
berfungsi untuk melakukan push sebuah routing (halaman) ke top of stack navigation. Navigator.pushReplacement
berfungsi untuk mereplace route yang sedang ditampilkan.
- Drawer = membuat menu pada sisi kiri aplikasi sebagainavigasi
- ListViewBuilder = menampilkan data dari form (dengan kata lain menampilkan widget children)
- ListTile = menampilkan pilihan pada drawer
- TextFormField = menerima input teks
- Icon = widget untuk menampilkan ikon
- DropdownButton = menampilkan pilihan input
onSaved, onHover, onPressed, dan onTap.
Halaman dikenal dengan istilah routes
pada Flutter. Ketika berpindah page/routes, navigasi akan menjadi tumpukan (stack). Jadi ketika berpindah ke screen lain (push), maka screen pertama akan ditumpuk oleh screen kedua. Kemudian apabila kembali dari screen kedua ke pertama, maka screen kedua akan dihapus (pop)
- Membuat page untuk form pada
tambah.dart
. Form berisi input yang menerima judul budget (string), nominal budget (int), jenisBudget (string) dengan pilihan pemasukan atau pengeluaran, dan tanggal dalma bentuk date picker. - Menampilkan data dari submisi form dengan ListView builder
- Membuat drawer dengan code sebagai berikut
drawer: Drawer(
child: Column(
children: [
// Menambahkan clickable menu
ListTile(
title: const Text('counter_7'),
onTap: () {
// Route menu ke halaman utama
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => const MyHomePage()),
);
},
),
ListTile(
title: const Text('Tambah Budget'),
onTap: () {
// Route menu ke halaman form
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => const FormPage()),
);
},
),
ListTile(
title: const Text('Data Budget'),
onTap: () {
// Route menu ke halaman data
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => const BudgetDataPage()),
);
},
),
],
),
),
Apakah bisa kita melakukan pengambilan data JSON tanpa membuat model terlebih dahulu? Jika iya, apakah hal tersebut lebih baik daripada membuat model sebelum melakukan pengambilan data JSON?
Bisa, tetapi lebih baik menggunakan model. Jika tidak membuat model terlebih dahulu, ada beberapa kekurangan yaitu proses pengambilan data lebih rumit, eror lebih sulit dideteksi (jika memakai model, semua data akan divalidasi), dan sulit untuk menetapkan struktur dari data yang diambil.
Widget | Fungsi |
---|---|
Drawer |
membuat menu pada sisi kiri aplikasi sebagainavigasi |
Icon |
menampilkan ikon |
Padding |
mengatur jarak antar child |
SizedBox |
membuat jarak antar widget |
ListTile |
menampilkan pilihan pada drawer dalam bentuk list |
Text |
menampilkan text |
Scaffold |
membuat layout pada aplikasi |
Dengan memanfaatkan HTTP package pada flutter, HTTP akan fetch data dari API endpoint yang sudah dibuat. Lalu, terdapat function pada library dart:convert
, yaitu json.decode()
untuk build objek Dart dari data JSON dan json.encode()
untuk serialize objek Dart menjadi string JSON. Selanjutnya, untuk melakukan request HTTP GET, URI dari resource harus diimplement pada code. Setelah HTTP request berhasil dihandle dan data berhasil difetch, json.decode
-
Pendefinisian model
Mendefinisikan model yang digunakan ketika melakukan pemanggilan web service. Caranya menambahkan class bernamaMyWatchList
pada..\lib/model/watchlistmodel.dart
.MyWatchList
adalah suatu model yang merepresentasikan response dari pemanggilan web service. -
Menambah dependensi HTTP
Menambahkan dependensi HTTP dengan cd ke aplikasi lalu melakukan perintahflutter pub add http
, lalu menambahkan snippet code<uses-permission android:name="android.permission.INTERNET" />
padaandroid/app/src/main/AndroidManifest.xml
-
Mengambil dan mengolah data dari web service
Pertama, tambahkan impor yang dibutuhkan pada..\lib\services\fetchwatchlist.dart
, lalu masukkan potongan code yang ditambahkan untuk fetch data dari endpoint JSON di Django yang telah dideploy -
Menambahkan tombol navigasi ke arah page
My Watch List
pada drawer
Tambahkan code sebagai berikut padadrawer.dart
ListTile(
title: const Text('My Watch List'),
onTap: () {
// Route menu ke halaman data
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => const WatchListPage()),
);
},
),
- Menambahkan halaman detail untuk My Watch List
Pada..\lib\screens\mywatchlist_detail.dart
, tambahkan tombol untuk back sebagai berikut:
CircleAvatar(
backgroundColor: Colors.grey,
child: IconButton(
icon: const Icon(
Icons.arrow_back,
color: Colors.white,
),
onPressed: () {
Navigator.pop(context);
},
),
),
Selanjutnya, tambahkan code untuk menampilkan data.
- Menambahkan halaman berisi data watchlist
Pada
..\lib\screens\mywatchlist.dart
, tambah code untuk menampilkan judul watchlist di setiap card
TODO: [x] pbp_django_auth [ ] import 'package:pbp_django_auth/pbp_django_auth.dart'; -> DITAROH WHERE?? https://pub.dev/packages/pbp_django_auth/install [x] Django's part udah di TUGAS-2-PBP bener gasih [ ] https://pub.dev/packages/pbp_django_auth -> BELOM BAGIAN FLUTTER PART