166 lines
6.5 KiB
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"));
|
|
},
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|