Mini Flutter aplikacija za vježbu na času.
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Multi-Page Flutter App',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MainScreen(),
);
}
}
class MainScreen extends StatefulWidget {
@override
_MainScreenState createState() => _MainScreenState();
}
class _MainScreenState extends State<MainScreen> {
int _currentIndex = 0;
final List<Widget> _pages = [
HomePage(),
AboutPage(),
ContactPage(),
];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Gimnazija Doboj'),
centerTitle: true,
),
body: _pages[_currentIndex],
bottomNavigationBar: BottomNavigationBar(
currentIndex: _currentIndex,
onTap: (index) {
setState(() {
_currentIndex = index;
});
},
items: [
BottomNavigationBarItem(
icon: Icon(Icons.home),
label: 'Home',
),
BottomNavigationBarItem(
icon: Icon(Icons.info),
label: 'About',
),
BottomNavigationBarItem(
icon: Icon(Icons.contact_mail),
label: 'Contact',
),
],
),
);
}
}
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'Home',
style: Theme.of(context).textTheme.headlineMedium,
),
SizedBox(height: 20),
Text(
'Ovo je aplikacija racunarskog smjera nase skole.',
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.bodyMedium,
),
],
),
),
);
}
}
class AboutPage extends StatefulWidget {
@override
_AboutPageState createState() => _AboutPageState();
}
class _AboutPageState extends State<AboutPage> {
final TextEditingController _temperatureController = TextEditingController();
final TextEditingController _humidityController = TextEditingController();
bool _loading = false;
@override
void initState() {
super.initState();
_fetchMeasurement();
}
Future<void> _fetchMeasurement() async {
setState(() {
_loading = true;
});
try {
final response = await http.get(
Uri.parse('https://airsense.gimnazija.net/api/measurements/get-last-measurement'),
);
if (response.statusCode == 200) {
final data = json.decode(response.body);
_temperatureController.text = data['temperature'] ?? '';
_humidityController.text = data['humidity'] ?? '';
} else {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Failed to fetch data: ${response.statusCode}')),
);
}
} catch (e) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Error fetching data: $e')),
);
} finally {
setState(() {
_loading = false;
});
}
}
@override
void dispose() {
_temperatureController.dispose();
_humidityController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Center(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'About',
style: Theme.of(context).textTheme.headlineMedium,
),
SizedBox(height: 20),
TextFormField(
controller: _temperatureController,
decoration: InputDecoration(
labelText: 'Temperatura',
border: OutlineInputBorder(),
),
readOnly: true,
),
SizedBox(height: 16),
TextFormField(
controller: _humidityController,
decoration: InputDecoration(
labelText: 'Vlaznost vazduha',
border: OutlineInputBorder(),
),
readOnly: true,
),
SizedBox(height: 20),
ElevatedButton(
onPressed: _loading ? null : _fetchMeasurement,
child: _loading ? CircularProgressIndicator(color: Colors.white) : Text('Refresh'),
),
],
),
),
);
}
}
class ContactPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'Contact',
style: Theme.of(context).textTheme.headlineMedium,
),
SizedBox(height: 20),
Text(
'Kontaktirajte nas preko Boskovog Linkedina.',
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.bodyMedium,
),
],
),
),
);
}
}