TKK_E32210691/lib/home_view.dart

166 lines
6.5 KiB
Dart

import 'package:flutter/material.dart';
import 'package:firebase_database/firebase_database.dart';
import 'package:flutter/services.dart';
import 'package:url_launcher/url_launcher.dart';
import 'snr_rssi_delay_view.dart';
import 'package:intl/intl.dart'; // Tambahkan import ini untuk memparsing tanggal
class HomeView extends StatelessWidget {
final DatabaseReference _databaseReference =
FirebaseDatabase.instance.ref('location');
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
elevation: 0,
title: Text('Posisi Pendaki'),
),
body: Padding(
padding: EdgeInsets.all(16),
child: StreamBuilder<DatabaseEvent>(
stream: _databaseReference.onValue,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return Center(child: CircularProgressIndicator());
}
if (snapshot.hasError) {
return Center(child: Text("Error: ${snapshot.error}"));
}
if (snapshot.hasData && snapshot.data!.snapshot.value != null) {
Map<String, dynamic> data = Map<String, dynamic>.from(
snapshot.data!.snapshot.value as Map);
List<DataRow> rows = data.entries.map((entry) {
var key = entry.key;
var value = Map<String, dynamic>.from(entry.value as Map);
String time = value['time'];
String latitude = value['latitude'];
String longitude = value['longitude'];
String snr = value['snr'].toString();
String rssi = value['rssi'].toString();
String delay = value['delay'].toString();
String mapUrl =
'https://www.google.com/maps/search/?api=1&query=$latitude,$longitude';
return DataRow(cells: [
DataCell(
Text(time),
onTap: () {
Clipboard.setData(ClipboardData(text: time));
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text('Waktu disalin ke clipboard'),
));
},
),
DataCell(
Text('$latitude, $longitude'),
onTap: () {
Clipboard.setData(
ClipboardData(text: '$latitude, $longitude'));
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content:
Text('Latitude dan Longitude disalin ke clipboard'),
));
},
),
DataCell(
InkWell(
child: Text(
'Lihat Peta',
style: TextStyle(
color: Colors.green[700],
decoration: TextDecoration.underline,
),
),
onTap: () async {
Uri url = Uri.parse(mapUrl);
if (await canLaunchUrl(url)) {
await launchUrl(url);
} else {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text('Tidak dapat membuka peta'),
));
}
},
),
),
DataCell(
InkWell(
child: Text(
'Detail',
style: TextStyle(
color: Colors.green[700],
decoration: TextDecoration.underline,
),
),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => SnrRssiDelayView(
time: time,
snr: snr,
rssi: rssi,
delay: delay,
),
),
);
},
),
),
]);
}).toList();
// Urutkan baris berdasarkan nilai waktu dalam urutan dari lama ke baru
rows.sort((a, b) {
String timeA = (a.cells[0].child as Text).data!;
String timeB = (b.cells[0].child as Text).data!;
DateFormat format =
DateFormat("dd-MM-yyyy HH:mm:ss"); // Sesuaikan format
DateTime dateTimeA = format.parse(timeA);
DateTime dateTimeB = format.parse(timeB);
return dateTimeA
.compareTo(dateTimeB); // Urutan dari lama ke baru
});
// Balik urutan baris sehingga yang terbaru di atas
rows = rows.reversed.toList();
return LayoutBuilder(
builder: (context, constraints) {
double columnWidth = (constraints.maxWidth - 32) / 4;
return SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: SingleChildScrollView(
child: DataTable(
columnSpacing: columnWidth * 0.1,
columns: [
DataColumn(
label: Container(
width: columnWidth, child: Text('Waktu'))),
DataColumn(
label: Container(
width: columnWidth, child: Text('Lokasi'))),
DataColumn(
label: Container(
width: columnWidth, child: Text('Peta'))),
DataColumn(
label: Container(
width: columnWidth, child: Text('Detail'))),
],
rows: rows,
),
),
);
},
);
}
return Center(child: Text("Tidak ada data yang tersedia"));
},
),
),
);
}
}