naeil_location 0.0.3
naeil_location: ^0.0.3 copied to clipboard
A high-performance Flutter package for retrieving current GPS location and matching it with Korean administrative address data.
example/lib/main.dart
import 'package:flutter/material.dart';
import 'package:naeil_location/naeil_location.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Naeil Location Example',
theme: ThemeData(colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue), useMaterial3: true),
home: const LocationPage(),
);
}
}
class LocationPage extends StatefulWidget {
const LocationPage({super.key});
@override
State<LocationPage> createState() => _LocationPageState();
}
class _LocationPageState extends State<LocationPage> {
LocationData? _locationData;
String _status = 'Press the button to get location';
bool _isLoading = false;
Future<void> _getLocation() async {
setState(() {
_isLoading = true;
_status = 'Getting location...';
});
try {
// Check permission first
final hasPermission = await NaeilLocation.requestPermission();
if (!hasPermission) {
setState(() {
_status = 'Permission denied';
_isLoading = false;
});
return;
}
// Get location with address
final data = await NaeilLocation.getCurrentLocationWithAddress();
setState(() {
_locationData = data;
_status = 'Success';
_isLoading = false;
});
} catch (e) {
setState(() {
_status = 'Error: $e';
_isLoading = false;
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Naeil Location Example'), backgroundColor: Theme.of(context).colorScheme.inversePrimary),
body: Center(
child: Padding(
padding: const EdgeInsets.all(20.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
if (_isLoading)
const CircularProgressIndicator()
else ...[
Text(_status, textAlign: TextAlign.center, style: Theme.of(context).textTheme.bodyLarge),
const SizedBox(height: 20),
if (_locationData != null) ...[
Card(
elevation: 4,
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildInfoRow('Address', _locationData!.fullAddress),
const Divider(),
_buildInfoRow('Level 1', _locationData!.address.level1 ?? '-'),
_buildInfoRow('Level 2', _locationData!.address.level2 ?? '-'),
_buildInfoRow('Level 3', _locationData!.address.level3 ?? '-'),
const Divider(),
_buildInfoRow('Latitude', _locationData!.latitude.toStringAsFixed(6)),
_buildInfoRow('Longitude', _locationData!.longitude.toStringAsFixed(6)),
const Divider(),
_buildInfoRow('Grid X', _locationData!.gridX?.toString() ?? '-'),
_buildInfoRow('Grid Y', _locationData!.gridY?.toString() ?? '-'),
_buildInfoRow('Distance', '${_locationData!.distanceMeters?.toStringAsFixed(1)}m'),
],
),
),
),
],
const SizedBox(height: 30),
FilledButton.icon(
onPressed: _getLocation,
icon: const Icon(Icons.location_on),
label: const Text('Get Current Location'),
),
],
],
),
),
),
);
}
Widget _buildInfoRow(String label, String value) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 4.0),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
width: 80,
child: Text(label, style: const TextStyle(fontWeight: FontWeight.bold)),
),
Expanded(child: Text(value)),
],
),
);
}
}