Penjelasan Kode Flutter: Aplikasi Produktif
Ingin coba langsung aplikasi ini? Klik demo interaktif berikut:
Buka Demo Aplikasi Flutter di Zapp.page
Tentang Aplikasi
Aplikasi ini adalah tools produktif berbasis Flutter Web yang memiliki dua fitur utama:
- To-Do List – mencatat tugas dan menandainya jika selesai.
- Jadwal Mingguan – mencatat kegiatan harian setiap hari dalam seminggu.
Note: Aplikasi menggunakan localStorage lewat package dart:html untuk menyimpan data secara lokal di browser.
Fitur & Teknologi
- Animasi Menu – menggunakan
AnimationController & CurvedAnimation.
- To-Do Interaktif – tambah, ubah, hapus tugas; gunakan checkbox untuk menandai selesai.
- Jadwal Harian – atur kegiatan untuk setiap hari (Senin–Minggu).
- Responsive UI – UI bersih dengan tema teal dan gradien lembut.
- Persistensi Data – data disimpan di browser sehingga tetap ada meskipun reload.
Kode Dart Lengkap
Berikut adalah implementasi lengkapnya. Kamu bisa menyalinnya ke main.dart di project Flutter Web.
// *IMPORTS & MAIN*
import 'dart:convert';
import 'dart:html' as html;
import 'package:flutter/material.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) => MaterialApp(
title: 'Aplikasi Produktif',
debugShowCheckedModeBanner: false,
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.teal),
useMaterial3: true,
),
home: const HomePage(),
);
}
// *HOME PAGE*
class HomePage extends StatefulWidget {
const HomePage({super.key});
@override
State createState() => _HomePageState();
}
class _HomePageState extends State with SingleTickerProviderStateMixin {
bool _isExpanded = false;
late final AnimationController _controller;
late final Animation _animation;
@override
void initState() {
super.initState();
_controller = AnimationController(duration: const Duration(milliseconds: 300), vsync: this);
_animation = CurvedAnimation(parent: _controller, curve: Curves.easeInOut);
}
@override
void dispose() { _controller.dispose(); super.dispose(); }
void _toggleExpansion() {
setState(() {
_isExpanded ? _controller.reverse() : _controller.forward();
_isExpanded = !_isExpanded;
});
}
Widget _buildMenuButton(IconData icon, String label, Widget page) => SizedBox(
width: 250,
child: ElevatedButton.icon(
style: ElevatedButton.styleFrom(
backgroundColor: Colors.teal,
foregroundColor: Colors.white,
padding: const EdgeInsets.symmetric(vertical: 16),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
),
icon: Icon(icon),
label: Text(label, style: const TextStyle(fontSize: 16)),
onPressed: () => Navigator.push(context, MaterialPageRoute(builder: (_) => page)),
),
);
@override
Widget build(BuildContext context) => Scaffold(
appBar: AppBar(
title: const Text('Beranda'), centerTitle: true,
backgroundColor: Colors.teal, foregroundColor: Colors.white,
),
body: Container(
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [Colors.teal.shade50, Colors.blue.shade50],
begin: Alignment.topLeft, end: Alignment.bottomRight,
),
),
child: Center(
child: Column(mainAxisAlignment: MainAxisAlignment.center, children: [
if (_isExpanded) ...[
_buildMenuButton(Icons.check_circle, 'To-Do List', const TodoPage()),
const SizedBox(height: 20),
_buildMenuButton(Icons.calendar_month, 'Jadwal Mingguan', const JadwalPage()),
const SizedBox(height: 20),
],
SizedBox(
width: 250,
child: ElevatedButton.icon(
style: ElevatedButton.styleFrom(
backgroundColor: _isExpanded ? Colors.teal.shade700 : Colors.teal,
foregroundColor: Colors.white,
padding: const EdgeInsets.symmetric(vertical: 16),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
),
icon: Icon(_isExpanded ? Icons.close : Icons.menu),
label: Text(_isExpanded ? 'Tutup Menu' : 'Buka Menu', style: const TextStyle(fontSize: 16)),
onPressed: _toggleExpansion,
),
),
]),
),
),
);
}
// *TODO PAGE*
class TodoPage extends StatefulWidget {
const TodoPage({super.key});
@override
State createState() => _TodoPageState();
}
class _TodoPageState extends State {
static const _cacheKey = 'todoCacheV1';
List
Tips: Jika kamu ingin blog lebih keren, bisa tambahkan plugin syntax highlighter seperti PrismJS atau Highlight.js di Blogger untuk membuat code-nya benar-benar berdiri—warna-warnanya akan mirip seperti di IDE seperti VS Code.
Komentar
Posting Komentar