Laporan Praktikum Aplikasi Mobile

Setup Flutter Development, Stateless & Statefull Widget, Basic Widgets

Aliffia Humairah - 2311531004

Click to go to github


Langkah Pengerjaan:

A. Setup Lingkungan Flutter Development

1. Install GIT

Download GIT disini kemudian install sesuai dengan wizard instalasinya.

2. Install Visual Studio

Ada library flutter yang dibut menggunakan Bahasa C++ maka perlu diinstall Visual Studio.

  • Download visual studio disini
  • Install visual studio kemudan centang pada Desktop development with C++


  • 3. Install Android Studio

    Meskipun kita dapat membuat aplikasi flutter tanpa menggunakan Android Studio akan tetapi sangat direkomendasikan unutk menginstallnya, karena pada Android Studio terdapat Android SDK Manager dan kita dapat membuat emulator untuk menjalankan aplikasi flutter.

  • Download Android Studio disini
  • Install android studio, tutorial lengkap dapat dilihat disini
  • Setelah selesai diinstall, buat project baru kemudian cari menu SDK Manager


  • Pilih SDK Tools kemudian ceklis seperti gambar berikut :


  • Tunggu sampai proses download selesai
  • 4. Install Visual Studio Code
  • Download visual studio code disini
  • Install visual studio code
  • Tambahkan extentions flutter


  • 5. Install SDK Flutter
  • Download SDK Flutter versi stable disini
  • Extract SDK Flutter pada computer, misalkan pada directory C:\Users\{username}\dev
  • Selanjutnya tambahkan pada PATH dengan cara mengetikkan environment pada pencarian


  • Klik Environment Variables


  • Edit path dan tambahkan directory hasil extract kedalam path, misalkan directory extract C:\Users\{username}\dev tambahkan \bin


  • Cek Setup Flutter Development

  • Setelah mengikuti Langkah-langkah diatas, selanjutnya kita pastikan apakah lingkungan flutter development siap untuk digunakan.
  • Bukan Command Prompt / PowerShell / Terminal kemudian ketikkan flutter doctor


  • Jika tidak ada tanda silang maka kita siap untuk praktek membuat aplikasi menggunakan flutter, jika Android toolchain masih silang tidak masalah karena tidak digunakan pada praktikum kali ini.
  • B. Project Pertama Flutter “hai”

    Membuat project flutter dapat dilakukan menggunakan beberapa cara yaitu dapat melalui Command Prompt / Terminal dan juga dapat dibuat langsung dari IDE yang kita gunakan

    Via Terminal / Command Prompt
  • Buka terminal / command prompt kemudian ketikkan flutter create hai


  • Masuk directory cd hai dan ketikkan flutter run untuk menjalankan project hai
  • Muncul beberapa pilihan project akan dijalankan pada windows, chrome, edge. kemudian ketikkan 1,2, atau 3 untuk menampilkan outputnya, jika pilih Chrome, akan muncul seperti gambar berikut.



    Via Visual Studio Code
  • Buka Visual Studio Code.
  • Buka Command Palette dengan menekan Ctrl+Shift+P
  • Ketik Flutter: New Projectdan pilih opsi tersebut dari daftar.
  • Pilih jenis proyek yang ingin dibuat, biasanya"Application"
  • Pilih direktori tempat untuk menyimpan proyek.
  • Masukkan nama proyek “hai” dan tekan Enter
  • C. Struktur Project Flutter



    Keterangan :

  • lib/ berfungsi untuk menyimpan seluruh kode Dart. main.dart adalah class utama yang pertama kali akan di eksekusi
  • android/ berisi konfigurasi untuk aplikasi Android pada file build.gradle
  • ios/ berisi konfigurasi untuk aplikasi iOS pada file Info.plist
  • assets directory dibuat manual untuk menimpan aset aplikasi seperti gambar, font dll
  • test/ digunakan untuk menyimpan code testing
  • pubspec.yaml berfungsi sebagai file utama konfigurasi proyek flutter
  • README.md berisi deskripsi proyek (penjelasan aplikasi, cara install dll)
  • .gitignore digunakan untuk pengaturan GIT
  • D. Stateless dan Statefull Widget

    Stateless

    Stateless Widget merupakan widget yang data atau tampilannya tidak mengalami perubahan ketika sebuah state dijalankan, Widget ini bersifat statis atau tetap misalnya teks statis, logo aplikasi dll

  • Buat class baru pada directory lib dengan nama stateless.dart kemudian tambahkan kode program berikut.


  • Output :



    Statefull

    Statefull Widget merupakan widget dinamis yang ketika sebuah state berubah maka tampilan UI juga berubah. contohnya ketika tombol diklik atau ditekan maka tombol berubah warna atau form input nilainya berubah.

  • MyStateFulWidget merupakan class widget yang bersifat tetap (immutable) dan tidak memiliki state
  • _MyStateFulWidgetState kelas state yang memiliki properti yang dapat berubah (state) dan bertanggung jawab untuk membangun UI
  • Contoh penggunaan Statefull Widget :
  • Buat class baru pada directory lib dengan nama statefull.dart kemudian tambahkan kode program berikut.




  • Output :

    Halaman pertama yang muncul seperti pada gambar berikut.



    Jika diklik icon + maka akan langsung muncul kelipatan yang dimulai dari 2.



    E. Basic Widget

    Text

    Text merupakan widget dasar yang digunakan untuk menampikan teks pada layer.

    Properti :

  • data berisi teks yang akan ditampilkan
  • style properti yang menerima objek TextStyle yang digunakan untuk mengontrol tampilan teks seperti fontSize, color, fontWeight (bold), fontStyle (italic)
  • textAlign mengatur teks secara horizontal seperti TextAlign.center, left, right
  • maxLines berfungsi membatas jumlah baris yang akan ditampilkan
  • overflow mengatur teks yang terlalu panjang (TextOverflow.ellipsis) untuk menambahkan “.....” di akhir teks
  • contoh :



    Container

    Container merupakan widget yang berfungsi sebagai KOTAK yang dapat menampung ssatu widget child dan menyediakan berbagai properti untuk dekorasi, mengatur posisi dan mengatur ukuran widget.

    Properti :

  • child properti yang menerima satu widget yang akan ditempatkan didalam container
  • color mengatur warna background
  • width dan height mengatur lebar dan tinggi container
  • padding mengatur jarak antara konten dengan bagian dalam container
  • margin mengatur jarak antara container dengan widget lain diluar container
  • decoration properti yang menerima objek BoxDecoration yang dapat mengatur warna, border, corner radius dan shadow pada Container
  • contoh :



    ElevatedButton

    ElevatedButton merupakan widget yang mewakili tombol dan memiliki shadow

    Properti :

  • onPressed berfungsi untuk menerima sebuah fungsi atau callback ketika tombol di tekan
  • child properti yang berisi satu widget yang akan ditampilkan didalam tombol biasanya Text atau Icon
  • style properti yang menerima objek ButtonStyle sehingga dapat menyesuaikan tampilan tombol seperti backgroundColor, foregroundColor, padding dan shape
  • contoh :



    Icon

    ElevatedButton merupakan widget yang mewakili tombol dan memiliki shadow

    Properti :

  • Icon properti yang menerima object IconData yang merepresentasikan ikon yang akan ditampilkan dari kelas Icons atau CupertinoIcons
  • color mengatur warna ikon
  • size mengatur ukuran ikon dalam piksel
  • contoh :



    Image

    Image merupakan widget dasar yang digunakan untuk menampikan gambar dari berbagai sumber seperti asset, network, memory (byte data), file system.

    Properti :

  • image properti yang menerima object ImageProvider seperti AssetImage, NetworkImage dll)
  • width dan height mengatur ukuran ikon dalam piksel
  • fit digunakan untuk menyesuaikan ukuran gambar seperti cover, fill, contain
  • aligment digunakan untuk mengatur posisi gambar
  • contoh : Netwok Image



    CircleAvatar

    CircleAvatar adalah widget yang sering digunakan untuk menampilkan gambar profil pengguna atau inisialnya dalam bentuk lingkaran.

    Properti :

  • Child berfungsi untuk menerima sebuah fungsi atau callback ketika tombol di tekan
  • backgroundImage Digunakan untuk menampilkan gambar dari ImageProvider, seperti NetworkImage atau AssetImage.
  • radius Mengontrol ukuran lingkaran, ukuran defaultnya adalah 20.
  • backgroundColor Mengatur warna latar belakang lingkaran.
  • contoh :



    Latihan /Tugas:

  • Buatlah tampilan widget secara vertical dan horizontal dengan menggunakan minimal 3 buah basic widget dalam 1 tampilan
  •             
                    import 'package:flutter/material.dart';
    
                void main() => runApp(const MyWidgetApp());
                
                class MyWidgetApp extends StatelessWidget {
                  const MyWidgetApp({super.key});
                
                  @override
                  Widget build(BuildContext context) {
                    return const MaterialApp(
                      debugShowCheckedModeBanner: false,
                      home: WidgetScreen(),
                    );
                  }
                }
                
                class WidgetScreen extends StatelessWidget {
                  const WidgetScreen({super.key});
                
                  @override
                  Widget build(BuildContext context) {
                    return Scaffold(
                      backgroundColor: const Color.fromARGB(255, 255, 255, 255),
                      appBar: AppBar(
                        title: const Text("Vertical & Horizontal Widgets"),
                        centerTitle: true,
                        backgroundColor: const Color.fromARGB(255, 51, 175, 16),
                      ),
                      body: Center(
                        child: Column(
                          // VERTICAL layout utama
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: [
                            // Bagian 1: Teks
                            const Text(
                              "Basic Widgets",
                              style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
                            ),
                            const SizedBox(height: 20),
                
                            // Bagian 2: Deretan icon horizontal
                            Row(
                              // HORIZONTAL layout
                              mainAxisAlignment: MainAxisAlignment.center,
                              children: const [
                                Icon(
                                  Icons.home,
                                  size: 50,
                                  color: Color.fromARGB(255, 32, 176, 0),
                                ),
                                SizedBox(width: 30),
                                Icon(
                                  Icons.favorite,
                                  size: 50,
                                  color: Color.fromARGB(255, 255, 17, 0),
                                ),
                                SizedBox(width: 30),
                                Icon(Icons.star, size: 50, color: Colors.orange),
                              ],
                            ),
                            const SizedBox(height: 30),
                
                            // Bagian 3: Container
                            Container(
                              padding: const EdgeInsets.all(16),
                              decoration: BoxDecoration(
                                color: const Color.fromARGB(255, 178, 235, 169),
                                borderRadius: BorderRadius.circular(12),
                              ),
                              child: const Text(
                                "Ini adalah Container",
                                style: TextStyle(fontSize: 18),
                              ),
                            ),
                            const SizedBox(height: 30),
                
                            // Bagian 4: Tombol
                            ElevatedButton.icon(
                              onPressed: () {},
                              label: const Text("Klik Saya"),
                              style: ElevatedButton.styleFrom(
                                backgroundColor: const Color.fromARGB(255, 52, 169, 48),
                                foregroundColor: Colors.white,
                                padding: const EdgeInsets.symmetric(
                                  horizontal: 20,
                                  vertical: 12,
                                ),
                              ),
                            ),
                          ],
                        ),
                      ),
                    );
                  }
                }
                
            

    Outputnya:



  • Buatlah tampilan yang berisi informasi profile kalian (foto, nama, nim, Alamat, nomor handphone, jurusan) dengan mengimplementasikan seluruh basic widget yang ada pada modul praktikum ini.
  •             
                    import 'package:flutter/material.dart';
    
                    void main() {
                      runApp(const MyApp());
                    }
                    
                    class MyApp extends StatelessWidget {
                      const MyApp({super.key});
                    
                      @override
                      Widget build(BuildContext context) {
                        return MaterialApp(
                          home: Scaffold(
                            appBar: AppBar(
                              title: const Text('Profil Saya'),
                              backgroundColor: const Color.fromARGB(255, 246, 146, 255),
                            ),
                            body: SingleChildScrollView(
                              child: Column(
                                crossAxisAlignment: CrossAxisAlignment.center,
                                children: [
                                  const SizedBox(height: 40),
                                  // Foto Profil menggunakan CircleAvatar dan Image.asset
                                  CircleAvatar(
                                    radius: 80,
                                    backgroundColor: Colors.white,
                                    child: ClipOval(
                                      child: Image.asset(
                                        'assets/images/profil.jpg',
                                        width: 150,
                                        height: 150,
                                        fit: BoxFit.cover,
                                      ),
                                    ),
                                  ),
                                  const SizedBox(height: 20),
                                  // Nama
                                  const Text(
                                    "Aliffia Humairah",
                                    style: TextStyle(
                                      fontSize: 28,
                                      fontWeight: FontWeight.bold,
                                      color: Colors.black87,
                                    ),
                                  ),
                                  const SizedBox(height: 10),
                                  // NIM
                                  const Text(
                                    "2311531004",
                                    style: TextStyle(fontSize: 18, color: Colors.grey),
                                  ),
                                  const Divider(
                                    height: 40,
                                    thickness: 1,
                                    indent: 50,
                                    endIndent: 50,
                                    color: Colors.grey,
                                  ),
                                  // Informasi Kontak dalam Container dengan Icon dan Text
                                  _buildInfoContainer(
                                    icon: Icons.location_on,
                                    text: "Kapalo Koto, Kota Padang",
                                  ),
                                  _buildInfoContainer(icon: Icons.phone, text: "08123456789"),
                                  _buildInfoContainer(icon: Icons.school, text: "Informatika"),
                                  const SizedBox(height: 20),
                                  // Tombol untuk aksi
                                  ElevatedButton(
                                    onPressed: () {
                                      print("Tombol ditekan");
                                    },
                                    child: const Text("Hubungi Saya"),
                                  ),
                                  const SizedBox(height: 40),
                                ],
                              ),
                            ),
                          ),
                        );
                      }
                    }
                    
                    Widget _buildInfoContainer({required IconData icon, required String text}) {
                      return Container(
                        margin: const EdgeInsets.symmetric(horizontal: 20, vertical: 8),
                        padding: const EdgeInsets.all(15),
                        decoration: BoxDecoration(
                          color: Colors.blueGrey.shade50,
                          borderRadius: BorderRadius.circular(10),
                          boxShadow: [
                            BoxShadow(
                              color: Colors.grey.withOpacity(0.2),
                              spreadRadius: 2,
                              blurRadius: 5,
                              offset: const Offset(0, 3),
                            ),
                          ],
                        ),
                        child: Row(
                          children: [
                            Icon(icon, color: Colors.indigo),
                            const SizedBox(width: 15),
                            Expanded(child: Text(text, style: const TextStyle(fontSize: 16))),
                          ],
                        ),
                      );
                    }
                
            

    Outputnya:

    https://i.imgur.com/sqibvID.png

    File tugas dapat dilihat pada link GitHub: https://github.com/AliffiaHumrh/2311531004_PraktikumAplikasiMobile2_KelasB.git