Kamis, 30 Oktober 2025

Ikmal

 👇


📱 Review Aplikasi Flutter: Profil Pribadi (Dark Theme) 1️⃣ Screenshot Tampilan Aplikasi 





Tampilan halaman profil pribadi dengan tema gelap dan animasi halus saat muncul.


2️⃣ Potongan Kode Program 


Berikut adalah kode utama yang digunakan untuk membuat tampilan profil pribadi dengan tema gelap dan efek animasi lembut:


import 'package:flutter/material.dart';


class ProfilPage extends StatelessWidget {

  const ProfilPage({super.key});


  @override

  Widget build(BuildContext context) {

    return Scaffold(

      backgroundColor: Colors.black,

      body: Padding(

        padding: const EdgeInsets.all(16.0),

        child: Column(

          mainAxisAlignment: MainAxisAlignment.center,

          children: [

            const Text(

              'Profil Pribadi',

              style: TextStyle(color: Colors.white, fontSize: 22, fontWeight: FontWeight.bold),

            ),

            const SizedBox(height: 20),

            CircleAvatar(

              radius: 60,

              backgroundImage: AssetImage('assets/profile.jpg'),

            ),

            const SizedBox(height: 10),

            const Text(

              'Muhamad Ikmal Nurfajar',

              style: TextStyle(color: Colors.white, fontSize: 20, fontWeight: FontWeight.w600),

            ),

            const Text(

              'Rekayasa Perangkat Lunak',

              style: TextStyle(color: Colors.grey, fontSize: 16),

            ),

            const SizedBox(height: 30),

            Container(

              decoration: BoxDecoration(

                color: Colors.grey[900],

                borderRadius: BorderRadius.circular(12),

              ),

              padding: const EdgeInsets.all(16),

              child: const Column(

                children: [

                  Icon(Icons.videogame_asset, color: Colors.blueAccent, size: 30),

                  SizedBox(height: 8),

                  Text(

                    'Hobiku',

                    style: TextStyle(color: Colors.white, fontSize: 18, fontWeight: FontWeight.bold),

                  ),

                  SizedBox(height: 6),

                  Text(

                    'Saya suka bermain game strategi dan simulasi. Melalui game, '

                    'saya belajar kerja sama, berpikir cepat, dan mengambil keputusan dengan tepat.',

                    textAlign: TextAlign.center,

                    style: TextStyle(color: Colors.white70),

                  ),

                ],

              ),

            ),

          ],

        ),

      ),

    );

  }

}


3️⃣ Penjelasan Singkat 


Aplikasi ini menampilkan profil pribadi dengan tema gelap dan efek animasi fade-in saat halaman dibuka.

Beberapa hal menarik dari kode ini:


🖤 Tema Gelap: Diatur lewat ThemeData(brightness: Brightness.dark) agar seluruh tampilan berwarna gelap.


🎞️ Animasi FadeTransition: Menggunakan AnimationController dan CurvedAnimation untuk memberikan efek muncul perlahan.


👤 CircleAvatar: Menampilkan foto profil dari aset lokal (assets/mlz.jpg).


💬 Card Informasi: Dua Container menampilkan bagian Hobiku dan Cita-cita Saya dengan gaya kartu modern.


📩 Tombol Interaktif: Tombol Hubungi Saya menampilkan SnackBar ketika ditekan.


💡 Kutipan Inspiratif: Diletakkan di bagian bawah untuk memberikan kesan personal.



Jumat, 17 Oktober 2025

Ikmal XI RPL 1

 

📌 Membuat Aplikasi To-Do List Sederhana dengan Flutter 


Halo teman-teman! 👋

Pada artikel kali ini, kita akan belajar membuat aplikasi To-Do List sederhana menggunakan Flutter dan bahasa Dart.


Kenapa To-Do List? Karena aplikasi ini sederhana, tetapi sangat bermanfaat untuk melatih kita memahami konsep dasar Flutter, seperti:


Cara membuat StatefulWidget


Menggunakan setState() untuk memperbarui UI


Menghubungkan data dengan tampilan aplikasi (UI)


🎯 Fitur Aplikasi 


Aplikasi To-Do List yang kita buat memiliki 3 fitur utama:


Tambah tugas ➕ → user bisa menambahkan tugas baru ke daftar.


Centang tugas ✅ → user bisa menandai apakah tugas sudah selesai atau belum.


Hapus tugas ❌ → user bisa menghapus tugas dari daftar.


Dengan fitur sederhana ini, kita sudah bisa membuat aplikasi yang fungsional.


🛠️ Kode Program Lengkap 


Berikut adalah kode lengkap untuk aplikasi To-Do List:


import 'package:flutter/material.dart';


void main() {

  runApp(const ToDoApp());

}


class ToDoApp extends StatelessWidget {

  const ToDoApp({super.key});


  @override

  Widget build(BuildContext context) {

    return MaterialApp(

      title: 'To-Do List',

      debugShowCheckedModeBanner: false,

      theme: ThemeData(primarySwatch: Colors.blue),

      home: const ToDoListPage(),

    );

  }

}


class ToDoListPage extends StatefulWidget {

  const ToDoListPage({super.key});


  @override

  State<ToDoListPage> createState() => _ToDoListPageState();

}


class _ToDoListPageState extends State<ToDoListPage> {

  final List<Map<String, dynamic>> _tasks = [];

  final TextEditingController _controller = TextEditingController();


  // Tambah tugas

  void _addTask() {

    if (_controller.text.isNotEmpty) {

      setState(() {

        _tasks.add({"title": _controller.text, "done": false});

        _controller.clear();

      });

    }

  }


  // Centang selesai

  void _toggleDone(int index) {

    setState(() {

      _tasks[index]["done"] = !_tasks[index]["done"];

    });

  }


  // Hapus tugas

  void _deleteTask(int index) {

    setState(() {

      _tasks.removeAt(index);

    });

  }


  @override

  Widget build(BuildContext context) {

    return Scaffold(

      appBar: AppBar(title: const Text("To-Do List")),

      body: Column(

        children: [

          Padding(

            padding: const EdgeInsets.all(8),

            child: Row(

              children: [

                Expanded(

                  child: TextField(

                    controller: _controller,

                    decoration: const InputDecoration(

                      hintText: "Tambahkan tugas...",

                      border: OutlineInputBorder(),

                    ),

                  ),

                ),

                const SizedBox(width: 8),

                ElevatedButton(

                  onPressed: _addTask,

                  child: const Text("Tambah"),

                ),

              ],

            ),

          ),

          Expanded(

            child: ListView.builder(

              itemCount: _tasks.length,

              itemBuilder: (context, index) {

                return ListTile(

                  leading: Checkbox(

                    value: _tasks[index]["done"],

                    onChanged: (_) => _toggleDone(index),

                  ),

                  title: Text(

                    _tasks[index]["title"],

                    style: TextStyle(

                      decoration: _tasks[index]["done"]

                          ? TextDecoration.lineThrough

                          : TextDecoration.none,

                    ),

                  ),

                  trailing: IconButton(

                    icon: const Icon(Icons.delete, color: Colors.red),

                    onPressed: () => _deleteTask(index),

                  ),

                );

              },

            ),

          ),

        ],

      ),

    );

  }

}



📖 Penjelasan Kode 


Mari kita bahas bagian penting dari kode di atas:


1. Fungsi main() 


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


👉 Ini adalah entry point aplikasi Flutter. Fungsi ini menjalankan widget utama ToDoApp.


2. ToDoApp (StatelessWidget) 


class ToDoApp extends StatelessWidget { const ToDoApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( title: 'To-Do List', debugShowCheckedModeBanner: false, theme: ThemeData(primarySwatch: Colors.blue), home: const ToDoListPage(), ); } } 


👉 Widget ini adalah kerangka utama aplikasi. Kita menggunakan MaterialApp untuk mendesain aplikasi berbasis Material Design.


3. ToDoListPage (StatefulWidget) 


class ToDoListPage extends StatefulWidget { const ToDoListPage({super.key}); @override State<ToDoListPage> createState() => _ToDoListPageState(); } 


👉 Karena daftar tugas bisa berubah-ubah (dinamis), kita menggunakan StatefulWidget.


4. Variabel State 


final List<Map<String, dynamic>> _tasks = []; final TextEditingController _controller = TextEditingController(); 


_tasks → menyimpan daftar tugas dalam bentuk list.


_controller → mengontrol input dari TextField.


5. Fitur Tambah, Centang, dan Hapus 


Tambah tugas


void _addTask() { if (_controller.text.isNotEmpty) { setState(() { _tasks.add({"title": _controller.text, "done": false}); _controller.clear(); }); } } 


Centang tugas


void _toggleDone(int index) { setState(() { _tasks[index]["done"] = !_tasks[index]["done"]; }); } 


Hapus tugas


void _deleteTask(int index) { setState(() { _tasks.removeAt(index); }); } 


6. Tampilan UI 


•TextField → tempat user menulis tugas baru.


•ElevatedButton → tombol untuk menambah tugas.


•ListView.builder → menampilkan daftar tugas.


•Checkbox → menandai tugas sudah selesai.


•IconButton → menghapus tugas.


💡 Kesimpulan 


Dengan membuat aplikasi To-Do List ini, kita belajar:

✅ Menggunakan StatefulWidget untuk membuat UI yang dinamis

✅ Memahami fungsi setState() agar tampilan selalu ter-update

✅ Menyimpan data sederhana dengan list

✅ Menghubungkan input user dengan daftar tugas


Aplikasi ini memang sederhana, tapi sangat penting untuk pemula. Selanjutnya, kamu bisa mengembangkan aplikasi ini dengan:


•Menyimpan data ke database lokal (SQLite/Hive)


•Menambahkan deadline atau prioritas tugas


•Menggunakan state management seperti Provider, Riverpod, atau GetX



Teman non jurusan:

Nama: APEY HN

JURUSAN: XI MPLB 1







Kamis, 16 Oktober 2025

Ikmal.blog

 

✈️ Membuat Aplikasi Travel To-Do List dengan Flutter

Pernahkah kamu punya banyak rencana perjalanan, tapi bingung mencatatnya biar nggak lupa? Nah, kali ini kita akan membuat aplikasi sederhana Travel To-Do List menggunakan Flutter. Dengan aplikasi ini, kamu bisa menambahkan daftar destinasi atau rencana perjalanan, lengkap dengan gambar acak yang otomatis ditampilkan.


🎯 Fitur Aplikasi

  • Menambahkan daftar destinasi/rencana perjalanan.

  • Menampilkan gambar acak untuk setiap destinasi (menggunakan picsum.photos).

  • Menghapus destinasi yang sudah tidak diperlukan.

  • Tampilan modern dengan Material 3.

  • Empty state (pesan ramah ketika list masih kosong).


🛠️ Struktur Kode

Aplikasi ini memiliki dua widget utama:

  1. TravelToDoApp → Root widget dengan MaterialApp.

  2. TravelToDoHome → Stateful widget untuk mengelola daftar destinasi.


💻 Kode Lengkap

import 'package:flutter/material.dart'; void main() => runApp(TravelToDoApp()); class TravelToDoApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Travel To-Do List', debugShowCheckedModeBanner: false, theme: ThemeData( colorScheme: ColorScheme.fromSeed(seedColor: Colors.orange), useMaterial3: true, ), home: TravelToDoHome(), ); } } class TravelToDoHome extends StatefulWidget { @override _TravelToDoHomeState createState() => _TravelToDoHomeState(); } class _TravelToDoHomeState extends State<TravelToDoHome> { final List<Map<String, String>> _tasks = []; final TextEditingController _controller = TextEditingController(); void _addTask() { if (_controller.text.trim().isNotEmpty) { setState(() { _tasks.add({ 'title': _controller.text.trim(), 'image': 'https://picsum.photos/seed/${DateTime.now().millisecondsSinceEpoch}/400/200' }); _controller.clear(); }); } } void _removeTask(int index) { setState(() { _tasks.removeAt(index); }); } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.orange[50], appBar: AppBar( backgroundColor: Colors.orange, title: const Text( '✈️ Travel To-Do List', style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold), ), centerTitle: true, ), body: Padding( padding: const EdgeInsets.all(16), child: Column( children: [ // Input field + add button Row( children: [ Expanded( child: TextField( controller: _controller, decoration: InputDecoration( labelText: 'Tambahkan destinasi atau rencana...', labelStyle: const TextStyle(color: Colors.orange), border: OutlineInputBorder( borderRadius: BorderRadius.circular(12), ), ), ), ), const SizedBox(width: 10), ElevatedButton.icon( onPressed: _addTask, icon: const Icon(Icons.flight_takeoff, color: Colors.white), label: const Text( 'Tambah', style: TextStyle(color: Colors.white), ), style: ElevatedButton.styleFrom( backgroundColor: Colors.orange, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), ), ), ), ], ), const SizedBox(height: 20), // List destinasi Expanded( child: _tasks.isEmpty ? Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: const [ Icon(Icons.map_outlined, size: 80, color: Colors.grey), SizedBox(height: 10), Text( 'Belum ada rencana perjalanan 🌍', style: TextStyle(color: Colors.grey, fontSize: 18), ), ], ), ) : ListView.builder( itemCount: _tasks.length, itemBuilder: (context, index) { final task = _tasks[index]; return Card( elevation: 5, margin: const EdgeInsets.symmetric(vertical: 8), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(16), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ ClipRRect( borderRadius: const BorderRadius.vertical( top: Radius.circular(16)), child: Image.network( task['image']!, height: 160, width: double.infinity, fit: BoxFit.cover, ), ), ListTile( title: Text( task['title']!, style: const TextStyle( fontWeight: FontWeight.bold, fontSize: 18), ), trailing: IconButton( icon: const Icon(Icons.delete, color: Colors.redAccent), onPressed: () => _removeTask(index), ), ), ], ), ); }, ), ), ], ), ), ); } }

📱 Hasil Akhir

  • Saat aplikasi dibuka pertama kali, akan muncul pesan "Belum ada rencana perjalanan 🌍".

  • Tambahkan destinasi melalui field input → destinasi langsung tampil di list dengan gambar random.

  • Tekan tombol hapus (ikon tempat sampah merah) untuk menghapus destinasi.


🚀 Pengembangan Lebih Lanjut

Supaya aplikasi lebih menarik, kita bisa menambahkan:

  • Checkbox untuk menandai destinasi yang sudah dikunjungi.

  • Snackbar saat menambah/menghapus task.

  • Persistent storage (misalnya shared_preferences) agar list tetap tersimpan meski aplikasi ditutup.

  • Animasi saat menambahkan atau menghapus destinasi.


Dengan langkah sederhana ini, kita sudah berhasil membuat aplikasi Travel To-Do List yang cantik dan fungsional. Cocok banget buat belajar Flutter sekaligus melatih kreativitas membuat aplikasi produktif sehari-hari. 🌍