mk_offline_geolocator 0.0.1-dev
mk_offline_geolocator: ^0.0.1-dev copied to clipboard
A flutter plugin to support offline geolocator feature on MK operate road network.
example/lib/main.dart
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'dart:async';
import 'package:mk_offline_geolocator/mk_offline_geolocator.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
runApp(
const MyApp(),
);
}
class MyApp extends StatefulWidget {
const MyApp({Key? key}) : super(key: key);
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
bool isTrackingEnabled = false;
bool showCurrentPosition = false;
bool showCaptureImage = false;
bool showImagePreview = false;
bool showLoadingIndicator = false;
MkOfflineGeolocator geolocator = MkOfflineGeolocator(
config: Configuration(
gpkgInfoUrl: 'http://kira-lite-dev.kozut.local/api/gpkg/info',
gpkgDownloadUrl: 'http://kira-lite-dev.kozut.local/api/gpkg/download',
),
);
late StreamSubscription geolocatorSubscriptor;
late SectionLocationData currentLocationData;
final List<SectionLocationData> _initialSectionLocation = [
SectionLocationData(
kszam: '0',
km: 0,
m: 0,
pkod: 0,
szakLabel: '0',
leiras: '0',
wgs84X: 0,
wgs84Y: 0,
)
];
final ImagePicker _picker = ImagePicker();
late XFile? _cameraImage;
late Uint8List _subtitledImageBytes;
@override
void initState() {
super.initState();
geolocator.trackNearRoadsList().listen((event) {
print(event);
});
printTopoInfo();
}
Future<void> printTopoInfo() async {
try {
print(await geolocator.getRemoteTopologyInfo());
geolocator.updateTopologyGpkg().listen((event) {
print(event);
});
} catch (e) {
print(e);
}
}
@override
void dispose() {
// Dispose of the controller when the widget is disposed.
super.dispose();
}
void getCurrentLocation() async {
bool newStatus = !showCurrentPosition;
if (newStatus) {
List<SectionLocationData> geocodedLocation =
await geolocator.getLocationData();
setState(() {
currentLocationData = geocodedLocation[0];
showCurrentPosition = newStatus;
});
} else {
setState(() {
showCurrentPosition = newStatus;
});
}
}
void toggleLocationTracking() {
setState(() {
isTrackingEnabled = !isTrackingEnabled;
});
}
void _getImageFromCamera() async {
_cameraImage = await _picker.pickImage(
source: ImageSource.camera,
);
setState(() {
showCaptureImage = true;
showLoadingIndicator = true;
});
print(_cameraImage!.path);
_subtitledImageBytes =
await geolocator.getSubtitledImage(_cameraImage!.path, resize: true);
setState(() {
showLoadingIndicator = false;
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('MK Offline Geolocator Tester'),
),
body: Column(
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
ElevatedButton(
onPressed: getCurrentLocation,
child: Text(showCurrentPosition
? "Hide current position"
: "Get current position"),
),
ElevatedButton(
onPressed: toggleLocationTracking,
child: Text(
isTrackingEnabled
? "Stop location tracking"
: "Start location tracking",
),
)
],
),
Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
isTrackingEnabled
? StreamBuilder<List<SectionLocationData>>(
stream: geolocator.trackLocation(),
initialData: _initialSectionLocation,
builder: (
BuildContext context,
AsyncSnapshot<List<SectionLocationData>> snapshot,
) {
if (snapshot.connectionState ==
ConnectionState.waiting) {
return Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Visibility(
visible: snapshot.hasData,
child: Column(
children: [
Text(
"Útszám: ${snapshot.data![0].kszam} (${snapshot.data![0].pkod}): ${snapshot.data![0].km} + ${snapshot.data![0].m}",
),
Text(
"Közeli utak száma: ${snapshot.data!.length}")
],
),
),
],
);
} else if (snapshot.connectionState ==
ConnectionState.active ||
snapshot.connectionState ==
ConnectionState.done) {
if (snapshot.hasError) {
return Text(snapshot.error.toString());
} else if (snapshot.hasData) {
return Column(
children: [
Text(
"Útszám: ${snapshot.data![0].kszam} (${snapshot.data![0].pkod}): ${snapshot.data![0].km} + ${snapshot.data![0].m}",
),
Text(
"Közeli utak száma: ${snapshot.data!.length}")
],
);
} else {
return const Text('Empty data');
}
} else {
return Text('State: ${snapshot.connectionState}');
}
},
)
: const Text("Location tracking is disabled"),
],
),
showCurrentPosition
? Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Text("Actual position: "),
const SizedBox(width: 20),
Text(
"Útszám: ${currentLocationData.kszam} (${currentLocationData.pkod}): ${currentLocationData.km} + ${currentLocationData.m}",
)
],
)
: const Text("Current location unknown"),
Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
ElevatedButton.icon(
onPressed: _getImageFromCamera,
icon: const Icon(Icons.camera_alt),
label: const Text(
"Take picture",
),
),
],
),
showCaptureImage
? Expanded(
child: showLoadingIndicator
? const CircularProgressIndicator()
: Image.memory(_subtitledImageBytes),
)
: const Center(
child: Text(
"No image to show",
),
),
],
),
),
);
}
}