Pelajari bahasa Dart, widget Flutter, dan buat app dengan tombol ON/OFF (UI only).
Dart adalah bahasa pemrograman di balik Flutter. Mari pelajari syntax dasarnya.
Dartvoid main() {
// Tipe data dasar
String nama = 'IoT Academy';
int umur = 1;
double suhu = 27.5;
bool isConnected = false;
// var & final
var pesan = 'Hello Dart!'; // tipe otomatis
final pin = 2; // tidak bisa diubah
print('$nama - Suhu: $suhu°C');
print('Connected: $isConnected');
}
Dart// Fungsi sederhana
String getStatus(bool isOn) {
return isOn ? 'ON 🟢' : 'OFF 🔴';
}
// Fungsi dengan named parameter
double hitungSuhu({required double celsius}) {
return celsius * 9 / 5 + 32; // ke Fahrenheit
}
void main() {
print(getStatus(true)); // ON 🟢
print(hitungSuhu(celsius: 30)); // 86.0
}
Dartclass SensorData {
final String nama;
final double nilai;
final String satuan;
SensorData({
required this.nama,
required this.nilai,
required this.satuan,
});
String tampilkan() => '$nama: $nilai $satuan';
}
void main() {
var suhu = SensorData(nama: 'Suhu', nilai: 27.5, satuan: '°C');
print(suhu.tampilkan()); // Suhu: 27.5 °C
}
Tipe data dasar di Dart
Di Flutter, semua UI adalah Widget. Widget disusun seperti pohon (widget tree).
Struktur Widget Tree di Flutter
| Widget | Fungsi | Contoh |
|---|---|---|
Text | Menampilkan teks | Text('Hello') |
ElevatedButton | Tombol dengan elevasi | ElevatedButton(onPressed: ..., child: Text('Klik')) |
Column | Susun vertikal | Column(children: [...]) |
Row | Susun horizontal | Row(children: [...]) |
Container | Box dengan style | Container(color: Colors.blue) |
Icon | Ikon material | Icon(Icons.lightbulb) |
Widget ada 2 jenis: Stateless (tidak berubah) dan Stateful (bisa berubah).
Perbedaan StatelessWidget vs StatefulWidget
Buat app dengan tombol yang bisa toggle ON/OFF. Ini akan menjadi dasar untuk kontrol LED nanti.
Dart — lib/main.dartimport 'package:flutter/material.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData.dark().copyWith(
scaffoldBackgroundColor: const Color(0xFF0F172A),
),
home: const ControlPage(),
);
}
}
class ControlPage extends StatefulWidget {
const ControlPage({super.key});
@override
State<ControlPage> createState() => _ControlPageState();
}
class _ControlPageState extends State<ControlPage> {
bool isLedOn = false;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('LED Controller'),
backgroundColor: const Color(0xFF1E293B),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
// LED Indicator
Icon(
Icons.lightbulb,
size: 120,
color: isLedOn
? Colors.amber
: Colors.grey[700],
),
const SizedBox(height: 20),
// Status text
Text(
isLedOn ? 'LED: ON' : 'LED: OFF',
style: TextStyle(
fontSize: 28,
fontWeight: FontWeight.bold,
color: isLedOn
? Colors.greenAccent
: Colors.redAccent,
),
),
const SizedBox(height: 40),
// Toggle Button
ElevatedButton(
onPressed: () {
setState(() {
isLedOn = !isLedOn;
});
},
style: ElevatedButton.styleFrom(
backgroundColor: isLedOn
? Colors.redAccent
: Colors.greenAccent,
padding: const EdgeInsets.symmetric(
horizontal: 40,
vertical: 16,
),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
),
child: Text(
isLedOn ? 'TURN OFF' : 'TURN ON',
style: const TextStyle(
fontSize: 18,
color: Colors.black,
fontWeight: FontWeight.bold,
),
),
),
],
),
),
);
}
}
App toggle LED: klik tombol → setState() → UI berubah
setState() memberitahu Flutter untuk rebuild UI. Nanti ketika kita menghubungkan ke ESP32, kita akan menambahkan kode kirim data di dalam setState().