2025-02-22 19:00:07 +03:00
|
|
|
import 'package:flutter/material.dart';
|
2025-02-22 19:50:05 +03:00
|
|
|
import 'package:provider/provider.dart';
|
|
|
|
|
import 'sensor_provider.dart';
|
|
|
|
|
import 'package:timeago/timeago.dart' as timeago;
|
2025-02-22 19:00:07 +03:00
|
|
|
|
|
|
|
|
void main() {
|
2025-02-22 19:50:05 +03:00
|
|
|
runApp(
|
|
|
|
|
ChangeNotifierProvider(
|
|
|
|
|
create: (context) => SensorProvider(),
|
|
|
|
|
child: const MyApp(),
|
|
|
|
|
),
|
|
|
|
|
);
|
2025-02-22 19:00:07 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class MyApp extends StatelessWidget {
|
|
|
|
|
const MyApp({super.key});
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
|
return MaterialApp(
|
2025-02-22 19:50:05 +03:00
|
|
|
title: 'Sensor App',
|
2025-02-22 19:00:07 +03:00
|
|
|
theme: ThemeData(
|
2025-02-22 19:50:05 +03:00
|
|
|
primarySwatch: Colors.blue,
|
2025-02-22 19:00:07 +03:00
|
|
|
),
|
2025-02-22 19:50:05 +03:00
|
|
|
home: const SensorScreen(),
|
2025-02-22 19:00:07 +03:00
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-22 19:50:05 +03:00
|
|
|
class SensorScreen extends StatefulWidget {
|
|
|
|
|
const SensorScreen({super.key});
|
2025-02-22 19:00:07 +03:00
|
|
|
|
|
|
|
|
@override
|
2025-02-22 19:50:05 +03:00
|
|
|
_SensorScreenState createState() => _SensorScreenState();
|
2025-02-22 19:00:07 +03:00
|
|
|
}
|
|
|
|
|
|
2025-02-22 19:50:05 +03:00
|
|
|
class _SensorScreenState extends State<SensorScreen> {
|
|
|
|
|
@override
|
|
|
|
|
void initState() {
|
|
|
|
|
super.initState();
|
|
|
|
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
|
|
|
|
Provider.of<SensorProvider>(context, listen: false).fetchData();
|
2025-02-22 19:00:07 +03:00
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
|
return Scaffold(
|
|
|
|
|
appBar: AppBar(
|
2025-02-22 19:50:05 +03:00
|
|
|
title: const Text('Mercury'),
|
2025-02-22 19:00:07 +03:00
|
|
|
),
|
|
|
|
|
body: Center(
|
2025-02-22 19:50:05 +03:00
|
|
|
child: Consumer<SensorProvider>(
|
|
|
|
|
builder: (context, sensorProvider, child) {
|
|
|
|
|
if (sensorProvider.sensorData == null) {
|
|
|
|
|
if (sensorProvider.error != null) {
|
|
|
|
|
return Text('Error: ${sensorProvider.error}');
|
|
|
|
|
}
|
|
|
|
|
return const CircularProgressIndicator();
|
|
|
|
|
} else {
|
|
|
|
|
final data = sensorProvider.sensorData!;
|
|
|
|
|
final timeAgo = timeago.format(DateTime.fromMillisecondsSinceEpoch(data.timestamp));
|
|
|
|
|
return Column(
|
|
|
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
|
|
|
children: [
|
|
|
|
|
Text('🌡️ Temperature: ${data.temperature}°C'),
|
|
|
|
|
Text('💧 Humidity: ${data.humidity}%'),
|
|
|
|
|
Text('❄️ Dew Point: ${data.dewPoint}°C'),
|
|
|
|
|
Text('🕒 $timeAgo'),
|
|
|
|
|
],
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
},
|
2025-02-22 19:00:07 +03:00
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
floatingActionButton: FloatingActionButton(
|
2025-02-22 19:50:05 +03:00
|
|
|
onPressed: () {
|
|
|
|
|
Provider.of<SensorProvider>(context, listen: false).fetchData();
|
|
|
|
|
},
|
|
|
|
|
child: const Icon(Icons.refresh),
|
2025-02-22 19:21:49 +03:00
|
|
|
),
|
2025-02-22 19:00:07 +03:00
|
|
|
);
|
|
|
|
|
}
|
2025-02-22 19:21:49 +03:00
|
|
|
}
|