BMI CALCULATOR
Membuat aplikasi calculator BMI
## **Apa itu BMI?**
BMI atau **Body Mass Index** adalah ukuran yang digunakan untuk menilai apakah berat badan Anda sehat berdasarkan tinggi badan. Rumusnya:
[
BMI = \frac{Berat\ Badan (kg)}{Tinggi\ Badan (m)^2}
]
**Kategori BMI:**
| BMI | Kategori |
| ----------- | -------- |
| < 18.5 | Kurus |
| 18.5 – 24.9 | Normal |
| 25 – 29.9 | Gemuk |
| ≥ 30 | Obesitas |
---
## **Tips Menjaga Berat Badan Sehat**
### 1. Jika BMI Anda **Kurus (<18.5)**
* Konsumsi **makanan tinggi protein**: telur, ayam, ikan, kacang-kacangan.
* Tambahkan **karbohidrat sehat**: nasi merah, kentang, oats.
* Latihan **strength training** untuk menambah massa otot.
* Jangan lewatkan **makanan utama** dan ngemil sehat.
### 2. Jika BMI Anda **Normal (18.5–24.9)**
* Pertahankan **pola makan seimbang**: protein, karbohidrat, lemak sehat.
* **Rutin olahraga** 3–5 kali per minggu.
* Tidur cukup (7–8 jam/hari) untuk menjaga metabolisme.
### 3. Jika BMI Anda **Gemuk (25–29.9)**
* Kurangi makanan tinggi gula dan lemak jenuh.
* Pilih makanan **rendah kalori tapi kaya serat**: sayur, buah, biji-bijian.
* Lakukan kombinasi **cardio + strength training** untuk membakar lemak.
* Minum cukup air, hindari minuman manis.
### 4. Jika BMI Anda **Obesitas (≥30)**
* Segera konsultasikan dengan **dokter atau ahli gizi**.
* Terapkan **diet seimbang** dengan pengawasan profesional.
* Olahraga ringan yang rutin: jalan cepat, berenang, atau bersepeda.
* Pantau berat badan secara berkala.
---
## **Tips Umum untuk Semua Orang**
* Catat makanan dan olahraga Anda untuk mengetahui kemajuan.
* Hindari diet ekstrem; fokus pada **kesehatan jangka panjang**.
* Tetap aktif secara fisik setiap hari, minimal 30 menit.
* Tidur cukup dan kelola stres untuk mendukung metabolisme tubuh.
---
### **Kesimpulan**
BMI adalah alat sederhana untuk **mengetahui status berat badan**, tapi **tidak menggantikan pemeriksaan medis**. Gunakan hasil BMI sebagai panduan awal dan kombinasikan dengan gaya hidup sehat untuk mendapatkan tubuh yang ideal dan sehat.
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(
debugShowCheckedModeBanner: false,
home: const BmiCalculator(),
);
}
}
class BmiCalculator extends StatefulWidget {
const BmiCalculator({super.key});
@override
State<BmiCalculator> createState() => _BmiCalculatorState();
}
class _BmiCalculatorState extends State<BmiCalculator> {
final TextEditingController nameController = TextEditingController();
final TextEditingController ageController = TextEditingController();
final TextEditingController weightController = TextEditingController();
final TextEditingController heightController = TextEditingController();
String gender = 'Laki-laki';
double? bmi;
String category = "";
final Color softGreen = const Color(0xFFA7F3D0);
void calculateBMI() {
String weightText = weightController.text.trim();
String heightText = heightController.text.trim();
if (weightText.isEmpty || heightText.isEmpty) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text("Tolong masukkan berat & tinggi badan")),
);
return;
}
double? weight = double.tryParse(weightText);
double? height = double.tryParse(heightText);
if (weight == null || height == null || weight <= 0 || height <= 0) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text("Berat & tinggi harus berupa angka lebih dari 0")),
);
return;
}
height = height / 100;
setState(() {
bmi = weight! / (height! * height);
if (bmi! < 18.5) {
category = "Kurus";
} else if (bmi! < 25) {
category = "Normal";
} else if (bmi! < 30) {
category = "Gemuk";
} else {
category = "Obesitas";
}
});
}
@override
Widget build(BuildContext context) {
// Responsif ukuran layar
double screenWidth = MediaQuery.of(context).size.width;
double screenHeight = MediaQuery.of(context).size.height;
double padding = screenWidth * 0.05;
double fontSize = screenWidth * 0.045;
double buttonHeight = screenHeight * 0.07;
return Scaffold(
backgroundColor: softGreen.withOpacity(0.2),
appBar: AppBar(
title: const Text("BMI Calculator"),
backgroundColor: softGreen,
),
body: SingleChildScrollView(
padding: EdgeInsets.all(padding),
child: Column(
children: [
// Nama
TextField(
controller: nameController,
decoration: InputDecoration(
labelText: "Nama",
labelStyle: TextStyle(fontSize: fontSize),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(10),
borderSide: BorderSide(color: softGreen),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(10),
borderSide: BorderSide(color: softGreen, width: 2),
),
),
),
SizedBox(height: padding),
// Umur
TextField(
controller: ageController,
keyboardType: TextInputType.number,
decoration: InputDecoration(
labelText: "Umur",
labelStyle: TextStyle(fontSize: fontSize),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(10),
borderSide: BorderSide(color: softGreen),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(10),
borderSide: BorderSide(color: softGreen, width: 2),
),
),
),
SizedBox(height: padding),
// Jenis Kelamin
Row(
children: [
Text("Jenis Kelamin: ", style: TextStyle(fontSize: fontSize)),
DropdownButton<String>(
value: gender,
items: <String>['Laki-laki', 'Perempuan']
.map((String value) => DropdownMenuItem<String>(
value: value,
child: Text(value, style: TextStyle(fontSize: fontSize)),
))
.toList(),
onChanged: (String? newGender) {
setState(() {
gender = newGender ?? 'Laki-laki';
});
},
),
],
),
SizedBox(height: padding),
// Berat Badan
TextField(
controller: weightController,
keyboardType: TextInputType.number,
decoration: InputDecoration(
labelText: "Berat Badan (kg)",
labelStyle: TextStyle(fontSize: fontSize),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(10),
borderSide: BorderSide(color: softGreen),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(10),
borderSide: BorderSide(color: softGreen, width: 2),
),
),
),
SizedBox(height: padding),
// Tinggi Badan
TextField(
controller: heightController,
keyboardType: TextInputType.number,
decoration: InputDecoration(
labelText: "Tinggi Badan (cm)",
labelStyle: TextStyle(fontSize: fontSize),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(10),
borderSide: BorderSide(color: softGreen),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(10),
borderSide: BorderSide(color: softGreen, width: 2),
),
),
),
SizedBox(height: padding * 1.5),
ElevatedButton(
onPressed: calculateBMI,
style: ElevatedButton.styleFrom(
backgroundColor: softGreen,
minimumSize: Size(screenWidth, buttonHeight),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(15),
),
),
child: Text(
"Hitung BMI",
style: TextStyle(fontSize: fontSize, color: Colors.white),
),
),
SizedBox(height: padding * 2),
if (bmi != null)
Card(
color: softGreen.withOpacity(0.3),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(15)),
child: Padding(
padding: EdgeInsets.all(padding),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"Halo, ${nameController.text.isEmpty ? '-' : nameController.text}!",
style: TextStyle(
fontSize: fontSize + 2,
fontWeight: FontWeight.bold,
color: softGreen.darken(0.2),
),
),
SizedBox(height: padding / 2),
Text(
"Umur: ${ageController.text.isEmpty ? '-' : ageController.text} Tahun",
style: TextStyle(
fontSize: fontSize,
color: softGreen.darken(0.2),
),
),
SizedBox(height: padding / 4),
Text(
"Jenis Kelamin: $gender",
style: TextStyle(
fontSize: fontSize,
color: softGreen.darken(0.2),
),
),
SizedBox(height: padding),
Text(
"BMI: ${bmi!.toStringAsFixed(2)}",
style: TextStyle(
fontSize: fontSize + 4,
fontWeight: FontWeight.bold,
color: softGreen.darken(0.2),
),
),
SizedBox(height: padding / 2),
Text(
"Kategori: $category",
style: TextStyle(
fontSize: fontSize + 2,
fontWeight: FontWeight.bold,
color: softGreen.darken(0.2),
),
),
],
),
),
),
],
),
),
);
}
}
// Extension untuk membuat warna lebih gelap
extension ColorBrightness on Color {
Color darken([double amount = .1]) {
assert(amount >= 0 && amount <= 1);
final f = 1 - amount;
return Color.fromARGB(
alpha,
(red * f).round(),
(green * f).round(),
(blue * f).round(),
);
}
}

Komentar
Posting Komentar