Modul Mobile Programming
Modul Mobile Programming
KATA PENGANTAR
Puji dan syukur penulis panjatkan ke hadirat Tuhan Yang Maha Esa, karena atas rahmat dan
karunia-Nya, modul pembelajaran Mobile Programming ini dapat disusun dan diselesaikan dengan baik.
Modul ini disusun sebagai bahan ajar dalam kegiatan perkuliahan yang bertujuan untuk memberikan
pemahaman praktis dan teoritis kepada mahasiswa mengenai pengembangan aplikasi mobile
menggunakan Flutter sebagai framework utama.
Di dalam modul ini, pembahasan mencakup berbagai topik penting seperti dasar-dasar Flutter,
penggunaan widget, manajemen state, integrasi database lokal dengan SQLite, pengelolaan media
(gambar, video, audio), hingga penggunaan arsitektur modern dan manajemen navigasi yang efektif.
Selain itu, modul ini juga membahas penggunaan GetX sebagai solusi manajemen state dan dependency
injection yang efisien dan mudah digunakan.
Modul ini disusun secara bertahap mulai dari konsep dasar hingga implementasi studi kasus dan
praktik langsung. Diharapkan mahasiswa dapat mengikuti materi secara runtut dan memperoleh
keterampilan teknis dalam membangun aplikasi mobile lintas platform (Android dan iOS) yang fungsional
dan interaktif.
Akhir kata, semoga modul ini dapat memberikan manfaat yang optimal bagi mahasiswa maupun
pihak lain yang ingin mempelajari pengembangan aplikasi mobile dengan Flutter.
KATA PENGANTAR.........................................................................................................................2
DAFTAR ISI ......................................................................................................................................3
DAFTAR GAMBAR .........................................................................................................................6
DAFTAR TABEL ..............................................................................................................................7
CHAPTER 1 INTRODUCTION .......................................................................................................8
1.1 Deskripsi Mata Kuliah.........................................................................................................8
1.2 Capaian Pembelajaran .........................................................................................................8
1.2.1 Capaian Pembelajaran Lulusan Program Studi (CPL-Prodi) ......................................8
1.2.2 Capaian Pembelajaran Mata Kuliah (CPMK) .............................................................8
1.3 Media Pembelajaran ............................................................................................................9
1.3.1 Perangkat Lunak ..........................................................................................................9
1.3.3 Pendukung .................................................................................................................10
CHAPTER 2 PENGENALAN FLUTTER DAN DART................................................................. 11
2.1 Kemampuan Akhir yang Diharapkan ................................................................................ 11
2.2 Bahasa Pemrograman Android .......................................................................................... 11
2.3 Apa Itu Dart? .....................................................................................................................13
2.4 Platform Dart .....................................................................................................................14
2.3.1 Flutter ........................................................................................................................14
2.3.2 Web ............................................................................................................................15
2.3.3 Server.........................................................................................................................15
2.5 Instalasi VSCode ...............................................................................................................16
2.6 Instalasi Flutter ..................................................................................................................19
2.7 Pengaturan Device Untuk Debugging ...............................................................................22
2.8 Membuat Project di Flutter................................................................................................ 25
CHAPTER 3 PENGENALAN FLUTTER DAN DART.................................................................26
3.1 Menyiapkan Emulator Android (Android Studio).............................................................26
3.2 Install ekstensi pada Visual Studio Code...........................................................................27
3.3 Membuat dan Menjalankan Project Flutter .......................................................................28
3.4 Pengenalan Bahasa Dart ....................................................................................................29
3.3.1 Karakteristik Dart ......................................................................................................29
3.3.2 Tipe Data ...................................................................................................................30
3.3.3 Final vs Const ............................................................................................................31
3.3.4 Comment ...................................................................................................................32
3.3.5 Function .....................................................................................................................33
3.3.6 Sync dan Async .........................................................................................................34
3.5 Object Oriented Programming (OOP) Dart.......................................................................47
3.5.1 Konsep OOP ..............................................................................................................47
3.5.2 Class & Object...........................................................................................................48
3.5.3 Constructor ................................................................................................................50
3.5.4 Inheritance .................................................................................................................50
3.5.5 Getter & Setter...........................................................................................................51
3.5.6 Abstract Class ............................................................................................................52
3.6 Flutter Dasar ......................................................................................................................52
CHAPTER 4 MANAJEMEN LAYOUT DAN WIDGET PADA FLUTTER .................................55
4.1 Pengenalan Widget dalam Flutter......................................................................................55
4.2 Widget Utama pada Flutter ............................................................................................... 56
4.2.1 Material App ..............................................................................................................56
4.2.2 Scaffold......................................................................................................................57
Universitas Harkat Negeri 3 Arif Hidayah, [Link]
4.2.3 AppBar ......................................................................................................................58
4.2.4 Container ...................................................................................................................58
4.3 Widget Dasar (Visible Widget)..........................................................................................60
4.3.1 Text ............................................................................................................................60
4.3.2 Flutter Logo ...............................................................................................................60
4.3.3 ElevatedButton ..........................................................................................................61
4.3.4 Icon ............................................................................................................................62
4.3.5 Image .........................................................................................................................63
4.4 Widget Layout (Invisible Widgets/Layouting) ..................................................................64
4.4.1 Center ........................................................................................................................64
4.4.2 Column ......................................................................................................................64
4.4.3 Row ...........................................................................................................................65
4.4.4 Stack ..........................................................................................................................65
4.4.5 Single Child Scroll View ...........................................................................................65
4.4.6 List View ...................................................................................................................66
4.4.7 Grid View ..................................................................................................................66
4.5 Ringkasan dan Kesimpulan ............................................................................................... 66
4.5.1 Perbedaan Visible vs Invisible Widget ......................................................................66
4.5.2 Pentingnya Layouting dalam Flutter .........................................................................67
4.5.3 Tips Mengelola Layout secara Efisien ......................................................................67
CHAPTER 5 MANAJEMEN DAN NAVIGASI STATE ................................................................ 68
5.1 Stateless vs Stateful Widget .............................................................................................. 68
5.1.1 Stateless Widget ........................................................................................................68
5.1.2 Stateful Widget ..........................................................................................................68
5.2 Komponen UI Interaktif ....................................................................................................69
5.2.1 Dialog ........................................................................................................................69
5.2.2 SnackBar ...................................................................................................................70
5.2.3 TextField ....................................................................................................................70
5.2.4 DropDown .................................................................................................................71
5.2.5 TabBar .......................................................................................................................72
5.3 Navigasi Antar Halaman ...................................................................................................73
5.3.1 BottonNavigationBar.................................................................................................73
5.3.2 BottomSheet ..............................................................................................................74
5.3.3 Drawer .......................................................................................................................75
5.3.4 Navigator ...................................................................................................................76
5.4 Ringkasan dan Kesimpulan ............................................................................................... 76
CHAPTER 6 CRUD SQLITE .........................................................................................................77
6.1 Konsep dasar Sqflite ..........................................................................................................77
6.2 Implementasi CRUD menggunakan Sqflite ......................................................................77
6.2.2 Struktur Folder Project .............................................................................................. 78
6.2.3 Membuat Model Note ............................................................................................... 79
6.2.4 Membuat DBHelper ..................................................................................................82
6.2.5 Membuat CRUD UI ..................................................................................................88
6.2.6 Menjalankan [Link] .............................................................................................. 97
CHAPTER 7 PENGELOLAAN MEDIA DALAM APLIKASI .....................................................98
7.1 Pengelolaan Gambar..........................................................................................................98
7.2 Pengelolaan Video ...........................................................................................................100
7.3 Pengelolaan Audio ...........................................................................................................103
CHAPTER 8 DEPLOYMENT FLUTTER ....................................................................................106
8.1 Pengantar Deployment ....................................................................................................106
8.2 Persiapan Deployment .....................................................................................................106
8.2.1 Instalasi dan Konfigurasi Lingkunga ......................................................................106
Universitas Harkat Negeri 4 Arif Hidayah, [Link]
8.2.2 Menyiapkan Project .................................................................................................107
8.2.3 Konfigurasi Splash Screen ......................................................................................107
8.3 Deployment Untuk Platform ...........................................................................................108
8.3.1 Android (APK & AAB) ...........................................................................................108
8.3.2 iOS ........................................................................................................................... 110
8.3.3 Web .......................................................................................................................... 110
8.3.4 Desktop .................................................................................................................... 111
8.4 Tips Deployment ............................................................................................................. 111
8.5 Ringkasan Perintah Penting............................................................................................. 111
1.3.3 Pendukung
Tabel 1. 3 Pendukung
Setelah menyelesaikan materi ini, mahasiswa dapat mengetahui bahasa pemrograman Dart.
1. Java
Java adalah bahasa pemrograman resmi pertama yang digunakan dalam pengembangan aplikasi
Android sejak awal dirilisnya Android SDK oleh Google. Java merupakan bahasa yang
berorientasi objek (OOP) dan memiliki komunitas pengembang yang sangat besar, serta
dokumentasi yang lengkap.
Kelebihan Java:
Java cocok digunakan oleh pemula hingga profesional, dan masih digunakan secara luas dalam
banyak proyek Android hingga saat ini.
2. C++
C++ digunakan dalam pengembangan aplikasi Android yang memerlukan kinerja tinggi, seperti
game atau aplikasi dengan pengolahan grafis dan multimedia. Bahasa ini tidak digunakan secara
langsung, melainkan melalui NDK (Native Development Kit), yang memungkinkan bagian
tertentu dari aplikasi ditulis dalam C++ untuk meningkatkan performa.
Kelebihan C++:
Namun, karena kompleksitas dan potensi terjadinya bug lebih tinggi, C++ umumnya digunakan
oleh developer berpengalaman dalam proyek-proyek khusus.
Kotlin adalah bahasa pemrograman yang dikembangkan oleh JetBrains dan sejak 2017 telah diakui
secara resmi oleh Google sebagai bahasa utama untuk pengembangan Android, mendampingi
Java.
Keunggulan Kotlin:
Kotlin kini banyak dipilih karena efisiensi pengembangan dan keterbacaannya yang tinggi.
4. Dart
Dart adalah bahasa pemrograman yang dikembangkan oleh Google dan digunakan untuk
mengembangkan aplikasi multiplatform menggunakan framework Flutter. Dengan Dart, developer
dapat membuat aplikasi untuk Android dan iOS hanya dari satu basis kode (single codebase),
menghemat waktu dan sumber daya.
Kelebihan Dart:
Flutter dan Dart menjadi pilihan favorit saat ini untuk pengembangan aplikasi mobile secara
efisien.
5. C#
6. JavaScript
JavaScript dapat digunakan untuk membangun aplikasi Android melalui framework seperti React
Native dan Ionic. Framework ini memungkinkan pengembangan aplikasi hybrid dengan performa
mendekati native.
JavaScript adalah solusi tepat bagi yang berasal dari latar belakang web development.
7. TypeScript
TypeScript adalah bahasa pemrograman yang merupakan superset dari JavaScript. Bahasa ini
menambahkan fitur pengetikan statis dan pengembangan skala besar ke dalam JavaScript.
Keunggulan TypeScript:
• Digunakan pada framework seperti Angular, serta bisa dengan React Native.
Awalnya dikembangkan untuk menggantikan JavaScript dalam pengembangan web, Dart kini
menjadi bahasa utama dalam membangun aplikasi multiplatform melalui framework Flutter.
Kemampuannya dalam mengkompilasi ke native code membuatnya efisien digunakan di berbagai
platform—baik mobile, web, maupun desktop.
• Google Adsense
• Google AdWords
• Google Fiber
2.3.1 Flutter
Salah satu kekuatan utama Flutter terletak pada sistem widget-nya yang fleksibel. Flutter
menyediakan ratusan widget siap pakai dan mudah dikustomisasi untuk membangun elemen UI
seperti tombol, teks, form, hingga layout kompleks. Selain itu, fitur hot reload pada Flutter
memungkinkan pengembang untuk langsung melihat hasil perubahan kode secara real-time
tanpa harus menjalankan ulang aplikasi, meningkatkan efisiensi dalam proses debugging dan
iterasi desain.
Flutter juga mendukung berbagai plugin dan integrasi dengan pustaka pihak ketiga untuk
menambahkan fitur seperti kamera, geolokasi, pembayaran, serta koneksi ke API atau database.
Karena Flutter bersifat native compiled, performanya sangat optimal bahkan untuk aplikasi yang
memerlukan animasi kompleks atau interaksi tinggi.
2.3.2 Web
Selain digunakan dalam pengembangan aplikasi mobile melalui Flutter, Dart juga dapat
digunakan untuk membangun aplikasi web, khususnya pada bagian front-end. Dart memiliki
kemampuan untuk dikompilasi (atau lebih tepatnya transpile) menjadi JavaScript, sehingga hasil
akhirnya tetap dapat dijalankan di seluruh web browser modern. Ini menjadikan Dart sebagai
alternatif bahasa front-end yang efisien dengan sintaks modern dan dukungan strong typing.
Framework lain yang juga digunakan adalah OverReact, yaitu framework Dart yang
memanfaatkan konsep React-style UI namun tetap ditulis dalam bahasa Dart. OverReact
digunakan untuk membuat komponen UI yang dinamis dan bisa digunakan ulang (reusable),
memberikan fleksibilitas dalam pengembangan front-end berbasis Dart. Dengan ekosistem ini,
Dart tetap menjadi bahasa yang relevan untuk pengembangan aplikasi web modern, khususnya
bagi pengembang yang menginginkan konsistensi bahasa dalam membangun aplikasi
multiplatform (mobile dan web) dari satu basis teknologi yang sama.
2.3.3 Server
Selain digunakan dalam pengembangan aplikasi mobile melalui Flutter, Dart juga dapat
digunakan untuk membangun aplikasi web, khususnya pada bagian front-end. Dart memiliki
kemampuan untuk dikompilasi (atau lebih tepatnya transpile) menjadi JavaScript, sehingga hasil
akhirnya tetap dapat dijalankan di seluruh web browser modern. Ini menjadikan Dart sebagai
alternatif bahasa front-end yang efisien dengan sintaks modern dan dukungan strong typing.
Framework lain yang juga digunakan adalah OverReact, yaitu framework Dart yang
memanfaatkan konsep React-style UI namun tetap ditulis dalam bahasa Dart. OverReact
digunakan untuk membuat komponen UI yang dinamis dan bisa digunakan ulang (reusable),
memberikan fleksibilitas dalam pengembangan front-end berbasis Dart.
Dengan ekosistem ini, Dart tetap menjadi bahasa yang relevan untuk pengembangan
aplikasi web modern, khususnya bagi pengembang yang menginginkan konsistensi bahasa dalam
membangun aplikasi multiplatform (mobile dan web) dari satu basis teknologi yang sama.
a. Hardware, Perangkat keras rekomendasi yang dibutuhkan yaitu memiliki processor 1.6 GHz or
faster processor, dan minimal memiliki 1 GB RAM.
b. Sistem operasi, Sistem operasi di windows minimal kalau memakai windows 7 wajib
Menginstal .NET Framework 4.5.2 untuk sistem operasi lain yaitu :
a. OS X Yosemite
Setelah memastikan perangkat keras dan sistem operasi telah memenuhi spesifikasi minimum
yang dibutuhkan, langkah selanjutnya adalah melakukan instalasi Visual Studio Code (VS Code). VS
Code merupakan editor kode sumber yang ringan, cepat, dan mendukung berbagai bahasa
pemrograman, termasuk Dart dan Flutter. Editor ini juga dilengkapi dengan berbagai ekstensi yang
mempermudah proses pengembangan aplikasi mobile dan web.
Langkah-langkah:
E:\src\flutter\bin
Sebelum melakukan proses debugging aplikasi Android secara langsung melalui perangkat fisik,
pengguna perlu mengaktifkan mode pengembang (developer mode) dan USB debugging di perangkat
Android. Berikut adalah langkah-langkah untuk mengatur device agar dapat digunakan untuk
debugging:
Setelah proses instalasi Flutter dan konfigurasi perangkat telah selesai dilakukan, tahap
selanjutnya adalah mencoba membuat proyek Flutter pertama. Berikut adalah langkah-langkah dasar
untuk membuat dan menjalankan project Flutter:
b. Type inference
Karakteristik ini dapat membuat suatu variable akan mengikuti tipe data dari valuenya.
Namun, hal tersebut tidak berlaku jika kita sudah memberi tipe data pada variablenya.
// variable name secara otomatis jadi String
print(name);
c. String expressions
Kita dapat menggunakan tanda $ untuk menampilkan suatu variable bertipe apapun ke
bentuk String. Hal ini dapat kita sebut sebagai String Interpolation.
// 3. Num: Tipe data umum untuk angka, bisa berupa int atau
double.
num age = 25; // Ini bisa berupa int atau double.
print("Num: $age");
Dalam contoh ini, nilai pi sudah diketahui pada waktu kompilasi, dan nilainya tidak akan
pernah berubah selama program berjalan.
Perbedaan Utama:
a. final: Dapat diinisialisasi hanya sekali, tetapi inisialisasi bisa dilakukan saat runtime.
b. const: Nilai harus sudah diketahui pada waktu kompilasi, artinya semua ekspresi yang
digunakan untuk menginisialisasi harus bersifat konstan.
3.3.4 Comment
/*
komentar x
komentar Y
*/
/// komentar 2
/**
*komentar x
*komentar Y
**/
3.3.5 Function
Function adalah blok kode yang dapat dipanggil untuk menjalankan tugas tertentu. Fungsi
membantu membuat kode menjadi lebih modular dan mudah dikelola.
main() {
print("--- Program luas persegi ---");
[Link]("Input panjang sisi: ");
int s = [Link]([Link]()!);
// memanggil fungsi
int hasil = luasPersegi(s);
void main() {
print('Mulai');
// Operasi asynchronous
asyncOperation().then((result) {
print(result);
});
print('Selesai');
}
Future<String> asyncOperation() async {
// Simulasi operasi yang memakan waktu lama
await [Link](Duration(seconds: 3));
// Menunggu 3 detik secara asinkron
return 'Operasi asinkron selesai';
}
3.3.7 Exception
Exception dalam Dart digunakan untuk menangani kondisi kesalahan (error) yang
mungkin terjadi saat program dijalankan, seperti kesalahan pembagian dengan nol, file
tidak ditemukan, dan sebagainya. Dart menyediakan blok try-catch untuk menangkap dan
menangani kesalahan tersebut, agar program tidak langsung berhenti secara tiba-tiba.
a. Basic try-catch
Struktur try-catch dasar digunakan untuk menangkap kesalahan umum yang terjadi di
dalam blok try. Ketika terjadi error, blok catch akan dijalankan dan menerima objek
exception yang menjelaskan jenis kesalahan.
Universitas Harkat Negeri 35 Arif Hidayah, [Link]
void main() {
try {
int result = 10 ~/ 0;
// Menghasilkan exception karena pembagian dengan nol.
print(result);
} catch (e) {
print('Terjadi kesalahan: $e');
b. Try-catch dengan
} Stack Trace
Selain menangkap
} exception, catch juga dapat menerima informasi StackTrace, yaitu
rincian jalur eksekusi kode hingga terjadinya kesalahan. Hal ini berguna untuk
debugging, karena menunjukkan baris kode penyebab error.
void main() {
try {
int result = 10 ~/ 0; // Menghasilkan exception
print(result);
} catch (e, s) {
print('Terjadi kesalahan: $e');
print('Stack trace: $s');
// Menampilkan informasi detail tentang lokasi error
}
}
c. Finally Block
Blok finally adalah blok opsional yang akan selalu dijalankan, baik ada exception
ataupun tidak. Ini sering digunakan untuk membersihkan resource (misalnya menutup
file atau koneksi).
void main() {
try {
int result = 10 ~/ 0; // Menghasilkan exception
print(result);
} catch (e) {
print('Terjadi kesalahan: $e');
} finally {
print('Ini akan selalu dijalankan');
}
}
Blok finally akan selalu dijalankan setelah try dan catch selesai, tidak peduli apakah
terjadi exception atau tidak.
d. Throw Keyword (Melempar Exception)
Keyword throw digunakan untuk memunculkan exception secara eksplisit berdasarkan
kondisi tertentu. Teknik ini memungkinkan pengembang mendefinisikan validasi dan
Universitas Harkat Negeri 36 Arif Hidayah, [Link]
logika error secara manual. Ini berguna ketika ingin memvalidasi kondisi tertentu
dalam program dan melempar exception jika kondisi tersebut tidak terpenuhi.
void validateAge(int age) {
if (age < 18) {
throw Exception('Umur harus lebih dari 18 tahun');
} else {
print('Validasi berhasil');
}
}
void main() {
try {
validateAge(16); // Ini akan menyebabkan exception
} catch (e) {
print('Error: $e');
}
}
Fungsi validateAge memeriksa apakah umur kurang dari 18 tahun. Jika ya, ia
melempar sebuah exception.
e. Membuat Exception Custom
Dart mendukung pembuatan exception khusus (custom exception) dengan
mendefinisikan kelas baru yang mengimplementasikan interface Exception. Custom
exception bermanfaat untuk memberikan penanganan error yang lebih spesifik dan
sesuai konteks aplikasi.
void main() {
for (int i = 0; i < 5; i++) {
print('Iterasi ke-$i');
}
}
void main() {
int i = 0;
while (i < 5) {
print('Iterasi ke-$i');
i++;
// Menambah nilai i setiap kali loop dijalankan
}
}
Loop ini akan terus berjalan selama kondisi i < 5 bernilai true.
c. do-while loop
Do-while loop hampir mirip dengan while loop, namun kondisi diperiksa setelah blok
kode dijalankan. Dengan demikian, blok akan dijalankan setidaknya satu kali,
meskipun kondisi bernilai false sejak awal.
do {
// Blok kode yang akan dijalankan setidaknya sekali
} while (condition);
void main() {
int i = 0;
do {
print('Iterasi ke-$i');
i++;
} while (i < 5);
}
Dalam contoh ini, blok kode di dalam do akan dijalankan terlebih dahulu, kemudian
kondisi diperiksa. Loop ini akan berjalan sebanyak 5 kali.
d. for-in loop
Universitas Harkat Negeri 39 Arif Hidayah, [Link]
For-in loop digunakan untuk iterasi langsung pada koleksi seperti List, Set, atau Map.
Setiap elemen dalam koleksi akan diakses satu per satu tanpa perlu indeks.
void main() {
List<String> fruits = ['Apple', 'Banana', 'Orange'];
for (var fruit in fruits) {
print('Buah: $fruit');
}
}
Pada contoh ini, loop akan berjalan sebanyak jumlah elemen dalam List dan mencetak
setiap elemen.
e. for each loop
ForEach adalah metode yang dimiliki oleh koleksi untuk melakukan iterasi. Fungsi
atau lambda digunakan untuk mengeksekusi perintah pada setiap elemen koleksi
secara deklaratif.
void main() {
List<String> fruits = ['Apple', 'Banana', 'Orange'];
[Link]((fruit) {
print('Buah: $fruit');
});
}
Pada contoh ini, setiap elemen dalam List akan diproses oleh fungsi forEach.
f. Break and continue loop
Break digunakan untuk menghentikan eksekusi loop secara paksa sebelum kondisi
selesai. Continue digunakan untuk melewatkan satu iterasi dan langsung lanjut ke
iterasi berikutnya, tanpa menjalankan perintah yang tersisa dalam loop untuk iterasi
tersebut.
Pada contoh ini, setiap kali nilai i adalah bilangan genap, perintah continue akan
melewatkan iterasi tersebut dan melanjutkan ke iterasi berikutnya.
Kesimpulan:
• for: Loop dasar yang cocok ketika Anda mengetahui jumlah iterasi yang diperlukan.
• while: Digunakan ketika Anda tidak tahu jumlah iterasi sebelumnya, tetapi ingin
melanjutkan loop selama kondisi tertentu benar.
• do-while: Mirip dengan while, tetapi selalu mengeksekusi blok kode setidaknya sekali.
• for-in: Digunakan untuk iterasi melalui elemen koleksi seperti List atau Map.
• forEach: Cara yang lebih deklaratif untuk melakukan iterasi melalui koleksi.
• break dan continue: Digunakan untuk mengontrol alur eksekusi di dalam loop.
main() {
print("=== Login ===");
[Link]("Password: ");
var password = [Link]();
String pass = [Link]().trim();
// cek password yang diinputkan
if (pass == "kopi") {
print("Selamat datang bos!");
} else {
print("Kamu siapa? Pergi sana!");
}
}
main() {
print("~~~ Quote Harian ~~~");
[Link]("Input hari: ");
var hr = [Link]();
String hari = [Link]().trim().toLowerCase();
String quote;
switch (hari) {
case "senin":
{
quote = "Mari kita mulai dari senin";
break;
}
case "selasa":
{
quote = "Selesaikan tugas, dan bersantailah";
break;
}
case "rabu":
{
quote = "Serbu! hari ini penuh semangat!";
break;
}
case "kamis":
{
quote = "Meski hujan gerimis, aku belajar coding";
break;
}
case "jumat":
{
quote = "Jum'at berkah";
break;
Universitas Harkat Negeri 42 Arif Hidayah, [Link]
}
case "sabtu":
{
quote = "Tenangkan jiwa di hari akhir!";
break;
}
case "minggu":
{
quote = "Selamat berlibur!";
break;
}
default:
{
quote = "Hari yang anda masukan salah!";
}
}
print(quote);
}
3.3.10 Collestions
Dalam Dart, collections adalah struktur data yang digunakan untuk menyimpan dan
mengelola sekelompok elemen atau objek. Dart menyediakan beberapa jenis koleksi yang
umum digunakan: List, Set, dan Map. Setiap jenis koleksi memiliki kegunaan dan
karakteristik yang berbeda, dan mereka dapat digunakan sesuai dengan kebutuhan dalam
program.
a. List
List adalah koleksi yang terurut dan dapat menyimpan elemen-elemen yang duplikat.
Elemen di dalam List dapat diakses berdasarkan indeksnya (indeks dimulai dari 0).
void main() {
// Membuat List
List<int> numbers = [1, 2, 3, 4, 5];
Fitur List:
void main() {
// Membuat Set
Set<String> fruits = {'Apple', 'Banana', 'Orange'};
Fitur Set:
• Tidak memiliki urutan tertentu.
• Hanya menyimpan elemen yang unik (tidak ada duplikat).
• Dapat menambah dan menghapus elemen secara dinamis.
c. Map
Map adalah koleksi yang menyimpan pasangan key-value. Setiap key dalam Map
harus unik, tetapi nilai (value) dapat memiliki duplikat. Map sering digunakan untuk
menyimpan data yang memiliki hubungan key-value, seperti kamus atau data JSON.
Fitur Map:
• Setiap elemen disimpan sebagai pasangan key-value.
• Key harus unik, tetapi nilai tidak harus unik.
• Dapat digunakan untuk menyimpan data yang memiliki hubungan identifikasi
antara key dan value.
3.3.11 Null Safety
Null safety di Dart adalah fitur yang dirancang untuk mencegah kesalahan null
reference, yang sering terjadi ketika kode mencoba mengakses atau menggunakan nilai
yang null. Dengan null safety, Dart memperkenalkan konsep tipe yang lebih aman,
memungkinkan pengembang untuk menentukan apakah variabel dapat bernilai null atau
tidak.
a. Konsep Dasar Null Safety
• Tipe Non-nullable: Secara default, semua tipe di Dart adalah non-nullable. Artinya,
variabel yang dideklarasikan tidak dapat memiliki nilai null.
• Tipe Nullable: Jika Anda ingin variabel dapat memiliki nilai null, Anda harus
menambahkan tanda tanya (?) setelah tipe data.
int? nullableNumber; // Nullable
nullableNumber = null; // Valid
• Penggunaan di Koleksi
Anda juga bisa memiliki koleksi dengan elemen nullable.
void main() {
List<int?> numbers = [1, 2, null, 4];
Null safety meningkatkan keamanan kode dengan mencegah kesalahan yang disebabkan oleh
null.
Tipe default adalah non-nullable, dan Anda perlu menggunakan ? untuk nullable.
Operator null-aware dan null-coalescing memudahkan pengelolaan nilai yang mungkin null.
Memanfaatkan null safety dapat membantu Anda menulis kode yang lebih aman dan lebih
mudah dipelihara.
// Named constructor
[Link](double size) : width = size, height
= size;
void main() {
Rectangle square = [Link](4);
print('Square area: ${[Link]()}'); // Output:
Square area: 16
}
3.5.4 Inheritance
Inheritance adalah konsep OOP yang memungkinkan satu class untuk mewarisi properti
dan metode dari class lain. Dart mendukung pewarisan dengan menggunakan keyword
extends.
Animal([Link]);
void makeSound() {
print('$name makes a sound');
}
}
void main() {
Dog dog = Dog('Rex');
[Link](); // Output: Rex barks
}
Circle(this._radius);
[Link] = 10;
print('Updated Area: ${[Link]}'); // Output: Updated Area:
314.0
}
void display() {
print('Shape has an area of ${getArea()}');
}
}
Rectangle([Link], [Link]);
@override
double getArea() => width * height;
}
void main() {
Rectangle rectangle = Rectangle(5, 10);
[Link](); // Output: Shape has an
area of 50.0
}
Setelah itu, widget Scaffold digunakan sebagai kerangka utama dalam setiap halaman
aplikasi. Scaffold dapat diibaratkan sebagai kanvas tempat kita melukis di atas papan kayu
tersebut.
Gambar 4. 2 Kanvas
Selain itu, terdapat juga widget Stack, yang memungkinkan kita menempatkan widget
secara bertumpuk pada sumbu Z (depan-belakang), sehingga dapat menciptakan efek tumpang
tindih antar elemen tampilan.
Contoh Penggunaan:
import 'package:flutter/[Link]';
void main(){
4.2.2 Scaffold
Scaffold adalah struktur dasar yang menyediakan kerangka layout untuk aplikasi. Scaffold
memberi beberapa fitur seperti AppBar, drawer, body, bottomNavigationBar, dan lainnya.
Contoh Penggunaan:
import 'package:flutter/[Link]';
void main(){
runApp(MyApp());
}
Contoh Lain
4.2.3 AppBar
AppBar digunakan sebagai bar navigasi di atas layar. Biasanya menampilkan title aplikasi
dan berisi beberapa aksi seperti tombol atau menu.
Contoh Penggunaan:
import 'package:flutter/[Link]';
void main(){
runApp(KelasBebas());
}
class KelasBebas extends StatelessWidget {
const KelasBebas({[Link]});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
backgroundColor: [Link][900],
title: Text("Aplikasi Pertamaku"),
centerTitle: true,
),
body: Center(
child: Text("Hello world"),
),
),
);
}
}
4.2.4 Container
Contoh Penggunaan:
import 'package:flutter/[Link]';
void main(){
runApp(KelasBebas());
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
backgroundColor: [Link][900],
title: Text("Aplikasi Pertamaku"),
centerTitle: true,
),
body: Center(
child: Container(
width: 200,
height: 200,
color: [Link],
child: Center(
child: Text("Hello world"),
),
),
),
),
);
}
}
Contoh Lain
Container(
Contoh Penggunaan:
Text(
'Hello, Flutter!',
style: TextStyle(fontSize: 24, color: [Link]),
);
Contoh Penggunaan:
import 'package:flutter/[Link]';
void main() {
runApp(KelasBebas());
}
@override
Widget build(BuildContext context) {
return MaterialApp(
Contoh Lain
FlutterLogo(
size: 100,
style: [Link],
);
4.3.3 ElevatedButton
ElevatedButton adalah tombol berbasis Material Design yang memiliki efek bayangan
(elevasi). Tombol ini digunakan untuk menangani aksi saat ditekan oleh pengguna.
Contoh Penggunaan:
import 'package:flutter/[Link]';
void main() {
runApp(KelasBebas());
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
backgroundColor: [Link][900],
title: Text("Aplikasi Pertamaku"),
centerTitle: true,
4.3.4 Icon
Icon digunakan untuk menampilkan ikon grafis, seperti simbol panah, rumah, atau ikon
sistem lainnya. Umumnya digunakan untuk memperjelas fungsi dari tombol atau fitur
tertentu.
Contoh Penggunaan:
import 'package:flutter/[Link]';
void main() {
runApp(KelasBebas());
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
backgroundColor: [Link][900],
title: Text("Aplikasi Pertamaku"),
centerTitle: true,
),
body: Center(
child: Icon(
[Link],
size: 200,
color: [Link][900],)
4.3.5 Image
Image digunakan untuk menampilkan gambar dari berbagai sumber, baik dari file lokal
(asset), dari internet (network), maupun dari memori aplikasi. Widget ini sangat penting
dalam membangun antarmuka visual yang menarik.
Contoh Penggunaan:
import 'package:flutter/[Link]';
void main() {
runApp(KelasBebas());
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
backgroundColor: [Link][900],
title: Text("Aplikasi Pertamaku"),
centerTitle: true,
),
body: Center(
// Image Provider
// 1. Asset Image
// buat folder (asset) pada root project
// pindahkan gambar ke folder (asset)
// daftarkan gambar pada [Link]
child: [Link]('images/[Link]'),
),
),
);
}
}
Contoh Penggunaan:
Center(
child: Text('Centered Text'),
);
4.4.2 Column
Digunakan untuk menyusun beberapa widget secara vertikal dari atas ke bawah. Cocok
ketika ingin menampilkan konten dalam urutan kolom.
Contoh Penggunaan:
4.4.3 Row
Berfungsi menyusun beberapa widget secara horizontal dari kiri ke kanan. Umumnya
digunakan untuk tata letak berdampingan secara sejajar.
Contoh Penggunaan:
Row(
children: [
Icon([Link]),
Text('Row Text'),
],
);
4.4.4 Stack
Memungkinkan beberapa widget ditumpuk di atas satu sama lain seperti lapisan. Widget
akan ditampilkan berdasarkan urutan penulisan, dari belakang ke depan.
Contoh Penggunaan:
Stack(
children: [
Container(
width: 100,
height: 100,
color: [Link],
),
Positioned(
top: 20,
left: 20,
child: Icon([Link], color: [Link]),
),
],
);
[Link](
crossAxisCount: 2,
children: [
Container(color: [Link], child: Text('Item 1')),
Container(color: [Link], child: Text('Item 2')),
Container(color: [Link], child: Text('Item 3')),
Container(color: [Link], child: Text('Item 4')),
],
);
Contoh StatelessWidget:
class MyStatelessWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Stateless Widget'),
),
body: Center(
child: Text('This is a stateless widget'),
),
);
}
}
void _incrementCounter() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Counter App - Stateful'),
),
body: Center(
child: Text('Counter: $_counter', style:
TextStyle(fontSize: 24)),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
child: Icon([Link]),
),
);
}
}
5.2.2 SnackBar
SnackBar digunakan untuk menampilkan notifikasi singkat di bagian bawah layar. Biasanya
digunakan untuk memberi tahu pengguna bahwa suatu aksi berhasil atau gagal, tanpa
mengganggu tampilan utama aplikasi. SnackBar bersifat sementara dan menghilang secara
otomatis setelah beberapa detik. Untuk menampilkannya, digunakan
[Link](context).showSnackBar().
Contoh SnackBar:
[Link](context).showSnackBar(
SnackBar(
content: Text('This is a SnackBar'),
duration: Duration(seconds: 2),
),
);
5.2.3 TextField
TextField merupakan widget yang digunakan untuk menerima input teks dari pengguna.
Widget ini sangat umum dipakai dalam formulir, pencarian, dan login. TextField mendukung
berbagai dekorasi dan kontrol, seperti placeholder, ikon, batasan input, serta mengelola nilai
input menggunakan TextEditingController.
Contoh TextField:
class MyTextField extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('TextField Example'),
),
body: Padding(
padding: const [Link](16.0),
child: TextField(
controller: _controller,
decoration: InputDecoration(
labelText: 'Enter text',
border: OutlineInputBorder(),
),
),
),
);
}
}
5.2.4 DropDown
DropDown atau DropdownButton memungkinkan pengguna memilih salah satu dari
beberapa opsi yang tersedia dalam bentuk menu drop-down. Cocok digunakan untuk
pemilihan kategori, pilihan kota, jenis kelamin, atau data lainnya yang bersifat pilihan tunggal.
Perubahan nilai akan memicu rebuild untuk menyesuaikan tampilan yang sedang dipilih.
Contoh DropDown:
class MyDropDown extends StatefulWidget {
@override
_MyDropDownState createState() => _MyDropDownState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Dropdown Example')),
5.2.5 TabBar
TabBar digunakan untuk menampilkan navigasi horizontal berbasis tab. Setiap tab bisa
mewakili tampilan berbeda dalam aplikasi dan dikaitkan dengan TabBarView. Biasanya
digunakan untuk mengorganisasi konten dalam kategori atau bagian berbeda, seperti halaman
“Beranda”, “Profil”, dan “Pengaturan”. DefaultTabController sering digunakan untuk
mengatur jumlah tab dan logika berpindah antar tab.
Contoh TabBar dengan TabBarView:
class MyTabBarApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return DefaultTabController(
length: 3,
child: Scaffold(
appBar: AppBar(
title: Text('TabBar Example'),
bottom: TabBar(
tabs: [
Tab(icon: Icon(Icons.directions_car), text: 'Car'),
Tab(icon: Icon(Icons.directions_bike), text: 'Bike'),
Tab(icon: Icon(Icons.directions_boat), text: 'Boat'),
Contoh BottomNavigationBar:
class MyBottomNavBar extends StatefulWidget {
@override
_MyBottomNavBarState createState() => _MyBottomNavBarState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('BottomNavigationBar Example')),
body: Center(
child: Text('Selected index: $_currentIndex'),
),
bottomNavigationBar: BottomNavigationBar(
currentIndex: _currentIndex,
items: [
5.3.2 BottomSheet
BottomSheet adalah panel geser dari bagian bawah layar yang menampilkan konten
tambahan atau tindakan pengguna. Terdapat dua jenis BottomSheet: modal (menutup interaksi
layar utama) dan persistent (tetap berada di layar). Biasanya digunakan untuk menampilkan
opsi tindakan cepat atau informasi tambahan, seperti menu berbagi atau filter data.
Contoh BottomSheet:
void _showBottomSheet(BuildContext context) {
showModalBottomSheet(
context: context,
builder: (BuildContext context) {
return Container(
padding: [Link](16),
height: 200,
child: Column(
children: [
Text('This is a Bottom Sheet'),
ElevatedButton(
onPressed: () {
[Link](context);
},
child: Text('Close'),
),
],
),
);
},
);
5.3.3 Drawer
Drawer adalah panel navigasi yang muncul dari sisi kiri (atau kanan) layar, biasanya dibuka
dengan menggeser atau ikon hamburger di AppBar. Drawer digunakan untuk navigasi utama
aplikasi dan dapat berisi daftar menu, akun pengguna, dan item navigasi penting lainnya.
Komponen ini sangat berguna dalam aplikasi dengan banyak fitur atau halaman.
Contoh Drawer:
class MyDrawerApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Drawer Example')),
drawer: Drawer(
child: ListView(
padding: [Link],
children: <Widget>[
DrawerHeader(
decoration: BoxDecoration(color: [Link]),
child: Text('Drawer Header', style:
TextStyle(color: [Link], fontSize: 24)),
),
ListTile(
title: Text('Item 1'),
onTap: () {
[Link](context);
},
),
ListTile(
title: Text('Item 2'),
onTap: () {
[Link](context);
},
),
],
),
),
body: Center(child: Text('Swipe from the left to open the
drawer')),
);
}
5.3.4 Navigator
Navigator adalah sistem navigasi bawaan Flutter yang digunakan untuk mengelola
perpindahan antar halaman (routes). Navigator bekerja dengan menambahkan dan menghapus
halaman dari stack. Metode seperti [Link]() digunakan untuk pindah ke halaman
baru, sedangkan [Link]() untuk kembali. Flutter juga mendukung named routes untuk
navigasi yang lebih terstruktur.
Navigasi Dasar dengan [Link]:
[Link](
context,
MaterialPageRoute(builder: (context) => SecondPage()),
);
Dengan Sqflite, pengembang dapat melakukan operasi dasar basis data, seperti:
• Eksekusi query SQL standar, seperti SELECT, INSERT, UPDATE, dan DELETE.
• Transaksi database, untuk memastikan data tetap konsisten saat melakukan operasi yang
kompleks.
• Pengaturan versi database, memungkinkan migrasi skema saat struktur database mengalami
perubahan.
Sqflite sangat bermanfaat dalam pembuatan aplikasi yang membutuhkan penyimpanan data lokal,
seperti:
• Aplikasi catatan pribadi,
• Aplikasi daftar tugas (to-do list),
• Aplikasi e-commerce yang mendukung mode offline,
• Dan berbagai aplikasi lain yang memerlukan cache data pengguna.
Perintah ini akan menambahkan baris ke file [Link] dan menjalankan flutter pub get
secara implisit.
6.2.2 Struktur Folder Project
Untuk memisahkan logika dan antarmuka agar kode lebih rapi dan mudah dikelola, kita
perlu membuat beberapa folder di dalam folder lib. Berdasarkan gambar struktur proyek di
atas, berikut adalah penjelasannya:
• lib/
Folder utama tempat semua source code aplikasi Flutter berada.
o helpers/
Folder ini digunakan untuk menyimpan file helper, salah satunya db_helper.dart
yang berisi logika pengelolaan database seperti koneksi, pembuatan tabel, dan
fungsi CRUD.
o models/
Berisi file model data, seperti note_model.dart, yang merepresentasikan struktur
data yang digunakan dalam aplikasi, termasuk fungsi konversi dari dan ke Map.
o ui/
Folder ini menyimpan bagian antarmuka pengguna atau tampilan (User Interface),
seperti notes_page.dart.
o [Link]
File utama aplikasi Flutter. Di sini biasanya terdapat runApp() yang memanggil
widget utama dari aplikasi.
}
Kode pada note_model.dart berfungsi sebagai model data untuk objek Note, yang
merepresentasikan catatan (note) dalam aplikasi. Model ini membantu dalam
memetakan data dari database SQLite ke dalam bentuk objek Dart, dan sebaliknya.
Berikut adalah penjelasan dari setiap bagian kode di file tersebut:
a. Deklarasi Kelas Note
class Note { int? id; String title;
String description;
b. Konstruktor
Note({[Link],required [Link],required [Link]});
1. Saat membuat catatan baru, objek Note diubah menjadi Map menggunakan
toMap(), lalu dimasukkan ke database.
2. Saat mengambil data dari database, data tersebut dikonversi kembali
menjadi objek Note menggunakan fromMap().
class DBHelper {
82
static final DBHelper _instance =
DBHelper._internal(); factory
DBHelper()=> _instance;
static Database?
_database;
DBHelper._internal();
Future<Database> get database
async {
if (_database != null)
return_database!;
_database = await _initDB();
return _database!;
}
Future<Database> _initDB()
async {
String path = join(await getDatabasesPath(),
'[Link]'); return await openDatabase(
path,
version: 1,
onCreate: (db, version) async {
await [Link]('''
CREATE TABLE notes(
id INTEGER PRIMARY KEY
AUTOINCREMENT,
title TEXT, description
TEXT
)
''');
},
);
}
// Insert Notes
Future<int> insert(Note note) async {
Database db = await database;
return await
[Link]('notes', [Link]());
}
// Get all Notes
Future<List<Note>> getNotes() async {
Database db = await database;
83
var result = await
[Link]('notes');
return [Link]((map) =>
[Link](map)).toList();
}
// Update Note
Future<int> update(Note note)
async {
Database db = await database;
return await [Link](
'notes',
[Link](),
where: 'id = ?',
whereArgs: [[Link]],
);
}
// Delete Note
Future<int> delete(int id) async {
Database db = await database; return await [Link](
'notes',
where: 'id = ?',
whereArgs: [id],
);
}
}
84
• DBHelper._internal(): Ini adalah private constructor yang hanya bisa dipanggil
dari dalam kelas. Dengan menggunakan pola singleton, kita memastikan
bahwa hanya satu instance dari DBHelper yang dibuat selama aplikasi berjalan.
• static final DBHelper _instance: Membuat instance tunggal dari DBHelper
untuk digunakan di seluruh aplikasi.
• factory DBHelper(): Menyediakan akses ke instance tunggal DBHelper. Setiap
kali DBHelper() dipanggil, instance yang sama akan dikembalikan.
• static Database? _database: Properti ini akan menyimpan referensi ke objek
Database setelah terhubung dengan SQLite. Tanda ? menunjukkan bahwa ini
bisa null, artinya belum ada instance Database saat kelas pertama kali
dipanggil.
b) Membuat atau Mengakses Database
Future<Database> get database async {
85
c) Inisialisasi Database
Future<Database> _initDB() async {
86
dari model Note. Hasilnya adalah int yang berisi ID dari baris yang baru
ditambahkan.
2) Get All Notes (Read)
Future<List<Note>> getNotes() async { Database
db = await database;
var result = await [Link]('notes');
return [Link]((map) =>[Link](map)).toList();
}
[Link](),
87
4) Delete
Future<int> delete(int id) async {
Database db = await database; return
await [Link](
'notes',
where: 'id = ?', whereArgs:
[id],
);
}
• [Link]('notes', where: 'id = ?', whereArgs: [id]);: Menghapus catatan
berdasarkan id dari tabel notes. Klausa WHERE digunakan untuk
menentukan baris mana yang akan dihapus.
88
TextEditingController descriptionController =
TextEditingController();
@override
void initState() {
[Link]();
_loadNotes();
}
showDialog(
context: context,
builder: (_) => AlertDialog(
title: Text('Edit Note'),
content: Column(
mainAxisSize: [Link],
children: [
TextField(
controller: titleController,
decoration: InputDecoration(labelText: 'Title'),
),
TextField(
controller: descriptionController,
decoration:InputDecoration(labelText: Description'),
),
],
),
actions: [
TextButton(
onPressed: () {
[Link](context);
},
child: Text('Cancel'),
),
TextButton(
89
onPressed: () async {
[Link] = [Link];
[Link] = [Link];
await DBHelper().update(note);
_loadNotes();
[Link]();
[Link]();
[Link](context);
},
child: Text('Save'),
),
],
),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Notes'),
),
body: Column(
children: [
Padding(
padding: [Link](8.0),
child: TextField(
controller: titleController,
decoration: InputDecoration(labelText: 'Title'),
),
),
Padding(
padding: [Link](8.0),
child: TextField(
controller: descriptionController,
decoration: InputDecoration(labelText:
'Description'),
),
),
ElevatedButton(
onPressed: _saveNote,
child: Text('Save Note'),
),
Expanded(
child: [Link](
itemCount: [Link],
itemBuilder: (context, index) {
Note note = notes[index];
return ListTile(
title: Text([Link]),
subtitle: Text([Link]),
trailing: Row(
mainAxisSize: [Link],
children: [
IconButton(
90
icon: Icon([Link]),
onPressed: () => _editNote(note),
),
IconButton(
icon: Icon([Link]),
onPressed: () => _deleteNote([Link]!),
),
],
),
);
},
),
),
],
),
);
}
}
Kode pada notes_page.dart bertanggung jawab untuk menampilkan antarmuka
pengguna (UI) dan menangani logika CRUD (Create, Read, Update, Delete) dari
catatan yang disimpan di SQLite. Pada file ini, kita membuat halaman utama yang
menampilkan daftar catatan, serta fitur untuk menambah, mengedit, dan menghapus
catatan. Berikut adalah penjelasan dari setiap bagian kode di file notes_page.dart:
a) Deklarasi dan Inisialisasi NotesPage
class NotesPage extends StatefulWidget { @override
_NotesPageState createState() => _NotesPageState();
}
• List<Note> notes: Ini adalah list yang digunakan untuk menyimpan catatan
yang akan ditampilkan dalam UI.
• TextEditingController titleController: Controller untuk menangani
input teks pada field judul catatan.
91
• TextEditingController descriptionController: Controller untuk menangani
input teks pada field deskripsi catatan.
92
e) Menyimpan Catatan Baru ( _saveNote() )
void _saveNote() async {
String title = [Link];
String description = [Link];
93
f) Mengedit Catatan ( _editNote() )
void _editNote(Note note) {
[Link] = [Link];
[Link] = [Link];
showDialog( context:
context,
builder: (_) => AlertDialog(
title: Text('Edit Note'),
content: Column(
mainAxisSize: [Link],
children: [
TextField(
controller: titleController,
decoration: InputDecoration(labelText: 'Title'),
),
TextField(
controller: descriptionController,
decoration: InputDecoration(labelText: 'Description'),
),
],
),
actions: [
TextButton(
onPressed: () {
[Link](context);
},
child: Text('Cancel'),
),
TextButton(
onPressed: () async {
[Link] = [Link];
[Link] = [Link];
await DBHelper().update(note);
_loadNotes();
[Link]();
[Link]();
[Link](context);
},
child: Text('Save'),
),
],
),
);
}
• _editNote(): Fungsi ini membuka dialog untuk mengedit catatan yang dipilih.
o showDialog(): Menampilkan dialog yang memungkinkan pengguna
untuk mengedit judul dan deskripsi catatan.
o TextField: Menampilkan input teks untuk judul dan deskripsi yang
diisi dengan nilai dari catatan yang akan diedit.
94
o Tombol "Save": Setelah pengguna selesai mengedit, perubahan
disimpan ke database menggunakan DBHelper().update(note), dan
daftar catatan diperbarui.
o Tombol "Cancel": Menutup dialog tanpa menyimpan perubahan.
g) Menghapus Catatan ( _deleteNote() )
void _deleteNote(int id) async{
await DBHelper().delete(id);
_loadNotes();
}
• _deleteNote(): Fungsi ini menghapus catatan berdasarkan id dari database
menggunakan metode delete() dari DBHelper. Setelah itu, daftar catatan
dimuat ulang untuk memperbarui UI.
h) Membangun Tampilan UI (build)
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Notes'),
),
body: Column(
children: [
Padding(
padding: [Link](8.0),
child: TextField(
controller: titleController,
decoration: InputDecoration(labelText: 'Title'),
),
),
Padding(
padding: [Link](8.0),
child: TextField(
controller: descriptionController,
decoration: InputDecoration(labelText:
'Description'),
),
),
ElevatedButton(
onPressed: _saveNote,
child: Text('Save Note'),
),
Expanded(
child: [Link](
itemCount: [Link],
itemBuilder: (context, index) {
Note note = notes[index];
return ListTile(
title: Text([Link]),
subtitle: Text([Link]),
trailing: Row(
mainAxisSize: [Link],
children: [
IconButton(
95
icon: Icon([Link]),
onPressed: () => _editNote(note),
),
IconButton(
icon: Icon([Link]),
onPressed: () => _deleteNote([Link]!),
),
],
),
);
},
),
),
],
),
);
}
• Scaffold: Mengatur struktur dasar halaman dengan AppBar dan body.
o AppBar: Menampilkan judul halaman ("Notes").
o TextField untuk Input: Dua input teks (untuk judul dan deskripsi
catatan) di atas daftar catatan.
o ElevatedButton: Tombol untuk menyimpan catatan baru. Ketika
ditekan, fungsi _saveNote() akan dipanggil.
o [Link]: Digunakan untuk menampilkan daftar catatan yang
diambil dari database. Setiap catatan ditampilkan dalam bentuk
ListTile.
▪ ListTile: Menampilkan judul dan deskripsi catatan.
▪ Trailing Actions: Menambahkan dua tombol di sebelah kanan
tiap catatan:
▪ Tombol edit untuk mengedit catatan.
▪ Tombol delete untuk menghapus catatan.
96
File notes_page.dart ini bertanggung jawab untuk:
1. Menampilkan UI yang berisi daftar catatan dan input untuk menambah catatan
baru.
2. Menyediakan fungsi untuk CRUD (Create, Read, Update, Delete) dengan
operasi database yang dilakukan menggunakan DBHelper.
3. Memperbarui tampilan secara dinamis ketika data diubah (misalnya, ketika
catatan ditambahkan, dihapus, atau diubah).
home: NotesPage(),
);
97
CHAPTER 7
PENGELOLAAN MEDIA DALAM APLIKASI
98
final XFile? image = await _picker.pickImage(source:
[Link]);
if (image != null) {
setState(() {
_image = File([Link]);
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Image Picker Example'),
),
body: Center(
child: Column(
mainAxisAlignment: [Link],
children: [
_image != null
? [Link](
_image!,
width: 200,
fit: [Link],
)
: Text('No image selected.'),
SizedBox(height: 20),
ElevatedButton(
onPressed: _pickImageFromGallery,
child: Text('Pick Image from Gallery'),
),
SizedBox(height: 10),
ElevatedButton(
onPressed: _pickImageFromCamera,
child: Text('Take Photo with Camera'),
),
],
),
),
);
}
}
99
Penjelasan Kode:
1. Stateful Widget: ImagePickerExample adalah StatefulWidget karena kita perlu
mengubah state aplikasi ketika gambar dipilih.
2. Mengambil Gambar:
• _pickImageFromGallery() menggunakan [Link]() untuk
memilih gambar dari galeri.
• _pickImageFromCamera() menggunakan [Link]() untuk
mengambil gambar dengan kamera.
3. Menampilkan Gambar: Jika gambar berhasil dipilih, gambar akan ditampilkan
menggunakan widget [Link]. Jika belum ada gambar yang dipilih, aplikasi
akan menampilkan teks "No image selected."
4. Tombol untuk Memilih Gambar: Ada dua tombol untuk memilih gambar—satu
untuk galeri dan satu lagi untuk kamera.
100
import 'package:image_picker/image_picker.dart';
import 'package:video_player/video_player.dart';
import 'dart:io';
@override
void dispose() {
[Link]();
_controller.dispose();
// Hapus controller saat widget dihancurkan
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
101
title: Text('Video Picker and Player'),
),
body: Center(
child: Column(
mainAxisAlignment: [Link],
children: [
102
4. Menampilkan Video:
• Video ditampilkan menggunakan widget AspectRatio untuk menjaga rasio aspek
video yang benar. VideoPlayer(_controller) digunakan untuk memutar video yang
terhubung dengan controller.
5. Dispose:
• Pada metode dispose, kita memastikan untuk membuang controller video ketika
widget dihancurkan untuk menghindari kebocoran memori.
<uses-permission android:name="[Link].WRITE_EXTERNAL_STORAGE"/>
iOS: Tidak ada izin khusus yang diperlukan untuk memutar file audio, tetapi jika
mengakses jaringan, pastikan menangani izin jaringan.
• Langkah 3: Kode Flutter
Berikut adalah contoh kode untuk memutar audio menggunakan audioplayers.
import 'package:flutter/[Link]';
import 'package:audioplayers/[Link]';
@override
void initState() {
[Link]();
103
_audioPlayer = AudioPlayer(); // Inisialisasi AudioPlayer
}
@override
void dispose() {
[Link]();
_audioPlayer.dispose(); // Hapus objek audio player saat widget
dihancurkan
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Audio Player Example'),
),
body: Center(
child: Column(
mainAxisAlignment: [Link],
children: [
Text(
_isPlaying ? 'Audio is Playing' : 'Audio is Stopped',
style: TextStyle(fontSize: 20),
),
SizedBox(height: 20),
IconButton(
icon: Icon(
_isPlaying ? [Link] : Icons.play_arrow,
size: 50,
),
onPressed: _isPlaying ? _pauseAudio : _playAudio,
),
SizedBox(height: 20),
IconButton(
104
icon: Icon(
[Link],
size: 50,
),
onPressed: _stopAudio,
),
],
),
),
);
}
}
Penjelasan Kode:
1. Menggunakan AudioPlayer:
AudioPlayer adalah kelas yang digunakan untuk memutar, menjeda, dan menghentikan
audio. Anda perlu menginisialisasi objek AudioPlayer di initState().
2. Memutar Audio:
Fungsi _playAudio akan memutar audio dari URL. Anda dapat mengganti URL ini
dengan URL audio Anda sendiri atau mengganti dengan path lokal jika menggunakan
file lokal (menggunakan [Link]('[Link] Anda bisa
menggunakan play() dengan URL audio atau file lokal.
3. Menghentikan Audio:
Fungsi _stopAudio akan menghentikan audio yang sedang diputar.
4. Menjeda Audio:
Fungsi _pauseAudio akan menjeda audio yang sedang diputar dan mengubah status ke
"paused".
5. Menampilkan Status Pemutaran Audio:
Menggunakan widget IconButton, aplikasi akan menampilkan ikon play, pause, atau
stop berdasarkan status audio (_isPlaying).
6. Dispose AudioPlayer:
Pada metode dispose(), kita membuang objek _audioPlayer agar tidak ada kebocoran
memori saat widget dihancurkan.
105
CHAPTER 8
DEPLOYMENT FLUTTER
106
• Editor: Gunakan Visual Studio Code atau Android Studio.
• Android Studio: Dibutuhkan untuk membangun aplikasi Android.
• Xcode: Dibutuhkan untuk membangun aplikasi iOS (khusus macOS).
Cek sistem dengan:
flutter doctor
Pastikan semua kebutuhan sudah tercentang hijau
8.2.2 Menyiapkan Project
1. Mengganti Nama dan Deskripsi Aplikasi
Edit [Link]:
name: nama_aplikasi
description: Deskripsi aplikasi Anda
Tambahkan dependency:
dev_dependencies:
flutter_native_splash: ^2.4.3
107
Masukkan konfigurasi di bawah ini di dalam file [Link], sesuaikan
warna dan path gambar sesuai kebutuhan kamu:
flutter_native_splash:
color: "#FFFFFF"
image: assets/icon/app_splash.png
• Jalankan:
flutter pub run flutter_native_splash:create
108
keyPassword=your_password
keyAlias=key_alias
storeFile=../[Link]
3) Konfigurasi [Link]
Edit file android/app/[Link]:
def keystoreProperties = new Properties()
def keystorePropertiesFile =
[Link]('[Link]')
if ([Link]()) {
[Link](new
FileInputStream(keystorePropertiesFile))
}
android {
// Konfigurasi lainnya seperti compileSdkVersion
dsb.
signingConfigs {
release {
storeFile
file(keystoreProperties['storeFile'])
storePassword
keystoreProperties['storePassword']
keyAlias keystoreProperties['keyAlias']
keyPassword
keystoreProperties['keyPassword']
}
}
buildTypes {
release {
signingConfig [Link]
minifyEnabled true
shrinkResources true
proguardFiles
getDefaultProguardFile('[Link]'),
'[Link]'
}
}
}
4) Build APK/AAB
flutter build apk --release
flutter build appbundle --release
build/web/
2. Hosting
Beberapa opsi hosting gratis untuk Web Flutter:
• Firebase Hosting
• Netlify
• Vercel
• GitHub Pages
Contoh: Firebase Hosting
bash
CopyEdit
npm install -g firebase-tools
firebase login
firebase init
firebase deploy
Pastikan memilih build/web sebagai direktori publik.
110
8.3.4 Desktop
a. Aktifkan Platform Desktop
flutter config --enable-windows-desktop
flutter config --enable-macos-desktop
flutter config --enable-linux-desktop
b. Build Aplikasi Desktop
flutter build windows
flutter build macos
flutter build linux
File hasil build akan berada di:
build/windows/runner/Release/
build/macos/Build/Products/Release/
build/linux/...
Anda bisa membuat installer sendiri (contoh: Inno Setup untuk Windows).
111
Tabel 8. 2 Ringkasan Perintah
112
113