Praktikum Aplikasi Mobile 2 – FLUTTER

Setup Lingkungan Flutter Development

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++

tampilannya akan seperti dibawah jika sudah terinstall, kurang lebih filenya berukuran 10GB

Struktur Folder dan File

Install Android Studio

Flutter sebenarnya bisa dijalankan tanpa Android Studio, tetapi disarankan untuk menggunakannya karena sudah dilengkapi dengan Android SDK Manager dan emulator untuk menjalankan aplikasi.

Download Android Studio disini

Setelah selesai diinstall, buat project baru kemudian cari menu "SDK Manager"

Pilih SDK Tools kemudian ceklis pada bagian "Android SDK build", "Android SDK command-line tools", "Android Emulator", "Android SDK Platform-tools", "Google Play Service"

Tunggu proses download selesai

Install SDK FLUTTER

Download SDK Flutter versi stable

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

Struktur Folder dan File

edit path dan tambahkan directory hasil extract kedalam path

Struktur Folder dan File

Cek Setup Flutter Development

Kalau semua langkah tadi udah dijalankan, sekarang kita cek dulu apakah lingkungan Flutter-nya udah siap dipakai atau belum

Bukan Command Prompt, ketikkan flutter doctor

Struktur Folder dan File

Jika tidak ada tanda silang maka kita siap untuk praktek membuat aplikasi menggunakan flutter

Project Flutter “hai”

Bikin project Flutter itu bisa lewat beberapa cara, misalnya pake Command Prompt / Terminal atau langsung dari IDE yang kita pakai

Struktur Folder dan File

masuk ke diirektori hai dan ketik flutter run untuk menjalankan projek

Struktur Folder dan File

Muncul beberapa pilihan, pilih yang chrome

Via Visual Studio Code

Langkah-langkah membuat project Flutter di VS Code:

  1. Buka Visual Studio Code.
  2. Buka Command Palette dengan menekan Ctrl + Shift + P.
  3. Ketik Flutter: New Project.
  4. Pilih Application.
  5. Pilih direktori untuk menyimpan proyek, lalu masukkan nama project.

Berikut tampilan project Flutter (kecuali bagian Stateless karena baru ditambahkan).

Struktur Folder dan File

Stateless dan Statefull Widget

Stateless Widget adalah jenis widget yang tampilannya tidak berubah meskipun ada state yang dijalankan. Widget ini bersifat tetap atau statis, contohnya seperti teks yang tidak berubah, ikon, maupun logo aplikasi.

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

import 'package:flutter/material.dart';

void main() {
  runApp(const MyStateless());
}

class MyStateless extends StatelessWidget {
  const MyStateless({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text("Stateless Widget"),
        ),
        body: const Center(
          child: Text("ini body"),
        ),
      ),
    );
  }
}
                

Outputnya seperti ini:

Output Stateless Widget

Stateful Widget

Stateful Widget merupakan widget dinamis yang ketika sebuah state berubah maka tampilan UI juga ikut berubah. Contohnya ketika tombol diklik atau ditekan maka tombol berubah warna, atau form input nilainya berubah.

  1. MyStatefulWidget merupakan class widget yang bersifat tetap (immutable) dan tidak memiliki state.
  2. _MyStatefulWidgetState adalah kelas state yang memiliki properti yang dapat berubah (state) dan bertanggung jawab untuk membangun UI.

Contoh:

  1. Buat file baru pada directory lib dengan nama stateful.dart kemudian tambahkan kode berikut:

import 'package:flutter/material.dart';

void main() {
  runApp(const MyStateful());
}

class MyStateful extends StatefulWidget {
  const MyStateful({super.key});

  @override
  State createState() => _MyStatefulState();
}

class _MyStatefulState extends State {
  int _kelipatan = 0;

  void _kelipatanDua() {
    setState(() {
      _kelipatan += 2;
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text("Stateful Widget"),
        ),
        body: Center(
          child: Container(
            width: 100,
            height: 100,
            color: Colors.amber,
            child: Column(
              children: [
                const Text("Kelipatan 2 : "),
                Text(
                  '$_kelipatan',
                  style: Theme.of(context).textTheme.headlineMedium,
                ),
              ],
            ),
          ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: _kelipatanDua,
          tooltip: "Kelipatan 2",
          child: const Icon(Icons.add),
        ),
      ),
    );
  }
}
                

Outputnya seperti ini:

Output Stateful Widget

Selain itu, terdapat beberapa widget dasar lainnya yang sering digunakan, seperti Text, Container, ElevatedButton, Icon, Image, dan CircleAvatar.

TUGAS

1. Untuk membuat widget secara vertikal (berderet ke bawah) kita gunakan Column, sedangkan untuk membuat widget secara horizontal (berderet ke samping) kita gunakan Row.

untuk kodenya bisa seperti di bawah 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("Tugas Vertical & Horizontal")),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              // Vertical (Column)
              const Text(
                "Vertical",
                style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
              ),
              const SizedBox(height: 10),
              ElevatedButton(
                onPressed: () {
                  print("Tombol vertical ditekan");
                },
                child: const Text("Vertical"),
              ),
              const Icon(Icons.star, color: Colors.amber, size: 40),

              const SizedBox(height: 40), // Jeda antar bagian

              // Horizontal (Row)
              const Text(
                "Horizontal",
                style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
              ),
              const SizedBox(height: 10),
              Row(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  const Icon(Icons.home, color: Colors.blue, size: 40),
                  const SizedBox(width: 20),
                  ElevatedButton(
                    onPressed: () {
                      print("Tombol horizontal ditekan");
                    },
                    child: const Text("Horizontal"),
                  ),
                  const SizedBox(width: 20),
                  const Text("Ini Text"),
                ],
              ),
            ],
          ),
        ),
      ),
    );
  }
}
                

Outputnya seperti ini:

Output Stateful Widget

2. untuk membuat tampilan yang berisi tentang foto, nama, nim, dan keterangan lainnya, kita bisa menggunakan widget-widget dasar yang sudah dicoba tadi, untuk contoh penggunaan bisa seperti kode di bawah ini


import 'package:flutter/material.dart';

void main() {
  runApp(const MyProfileApp());
}

class MyProfileApp extends StatelessWidget {
  const MyProfileApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text("Profil Mahasiswa")),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              const CircleAvatar(
                radius: 60,
                backgroundImage: NetworkImage(
                  "https://fajri.infokand23.my.id/assets/img/profil.jpg",
                ),
              ),
              const SizedBox(height: 20),

              const Text(
                "Ahmad Fajri Arrizki",
                style: TextStyle(fontSize: 22, fontWeight: FontWeight.bold),
              ),
              const Text(
                "NIM: 2311532004",
                style: TextStyle(
                  fontSize: 16,
                  color: Color.fromARGB(255, 0, 0, 0),
                ),
              ),
              const SizedBox(height: 20),

              Container(
                padding: const EdgeInsets.all(16),
                decoration: BoxDecoration(
                  color: Colors.blue.shade50,
                  borderRadius: BorderRadius.circular(12),
                  border: Border.all(
                    color: const Color.fromARGB(255, 12, 127, 215),
                  ),
                ),
                child: Column(
                  children: const [
                    Row(
                      children: [
                        Icon(
                          Icons.home,
                          color: Color.fromARGB(255, 0, 228, 245),
                        ),
                        SizedBox(width: 10),
                        Expanded(
                          child: Text(
                            "Alamat: kos mak inan, limau manih, kota padang",
                            style: TextStyle(fontSize: 14),
                          ),
                        ),
                      ],
                    ),
                    SizedBox(height: 10),
                    Row(
                      children: [
                        Icon(
                          Icons.phone,
                          color: Color.fromARGB(255, 0, 217, 255),
                        ),
                        SizedBox(width: 10),
                        Text("No HP: 083807556588"),
                      ],
                    ),
                    SizedBox(height: 10),
                    Row(
                      children: [
                        Icon(
                          Icons.school,
                          color: Color.fromARGB(255, 54, 209, 244),
                        ),
                        SizedBox(width: 10),
                        Text("Jurusan: Informatika"),
                      ],
                    ),
                  ],
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
                

Outputnya seperti ini:

Output Stateful Widget
well well well