TKK_E32221431/Flutter-Deli/lib/card_row.dart

111 lines
2.6 KiB
Dart

import 'dart:async'; // Untuk Timer
import 'package:flutter/material.dart';
import 'package:lottie/lottie.dart';
import 'services/api_service.dart';
import 'models/sensor_reading.dart';
class CardRow extends StatefulWidget {
const CardRow({super.key});
@override
_CardRowState createState() => _CardRowState();
}
class _CardRowState extends State<CardRow> {
List<SensorReading> _readings = [];
final ApiService apiService = ApiService();
Timer? _timer;
@override
void initState() {
super.initState();
fetchData(); // ambil data pertama kali
_timer = Timer.periodic(Duration(seconds: 3), (timer) {
fetchData(); // ambil data tiap 5 detik
});
}
void fetchData() async {
try {
List<SensorReading> newReadings = await apiService.getSensorReadings();
setState(() {
_readings = newReadings;
});
} catch (e) {
print("Error fetching data: $e");
}
}
@override
void dispose() {
_timer?.cancel(); // matikan timer saat widget dihancurkan
super.dispose();
}
@override
Widget build(BuildContext context) {
final latestReading = _readings.isNotEmpty
? _readings.last
: SensorReading(temperature: null, ppm: null, id: null, waterLevel: 0, createdAt: DateTime.now()); // atau nilai default
return Row(
children: [
// Card Suhu
Expanded(
child: buildCard(
'assets/suhu.json',
latestReading.temperature != null
? '${latestReading.temperature}°C'
: '',
),
),
// Card Daun
Expanded(
child: buildCard(
'assets/daun.json',
latestReading.ppm != null
? '${latestReading.ppm} PPM'
: '',
),
),
],
);
}
Widget buildCard(String assetPath, String valueText) {
return Container(
margin: EdgeInsets.all(12),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(15),
boxShadow: [
BoxShadow(
color: Colors.black26,
blurRadius: 5,
offset: Offset(2, 3),
),
],
),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
SizedBox(height: 8),
Lottie.asset(
assetPath,
height: 80,
width: 80,
),
SizedBox(height: 4),
Text(
valueText,
style: TextStyle(
fontSize: 18,
color: Colors.black,
),
),
],
),
);
}
}