country_code_locator 1.1.0 copy "country_code_locator: ^1.1.0" to clipboard
country_code_locator: ^1.1.0 copied to clipboard

Offline WGS 84 coordinate to official ISO 3166-1 Alpha-2 or Alpha-3 country code lookup for Flutter.

example/lib/main.dart

import 'package:country_code_locator/country_code_locator.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const CountryCodeLocatorExample());
}

class CountryCodeLocatorExample extends StatelessWidget {
  const CountryCodeLocatorExample({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: ThemeData(colorSchemeSeed: Colors.indigo, useMaterial3: true),
      home: const LookupPage(),
    );
  }
}

class LookupPage extends StatefulWidget {
  const LookupPage({super.key});

  @override
  State<LookupPage> createState() => _LookupPageState();
}

class _LookupPageState extends State<LookupPage> {
  final _latitudeController = TextEditingController(text: '35.6812');
  final _longitudeController = TextEditingController(text: '139.7671');
  CountryCodeFormat _format = CountryCodeFormat.alpha2;

  OfflineCountryCode? _locator;
  String _message = 'Loading bundled boundaries…';

  @override
  void initState() {
    super.initState();
    _load();
  }

  Future<void> _load() async {
    try {
      final locator = await OfflineCountryCode.load();
      if (!mounted) {
        return;
      }
      setState(() {
        _locator = locator;
        _message = 'Ready';
      });
    } on Object catch (error) {
      if (!mounted) {
        return;
      }
      setState(() => _message = 'Load failed: $error');
    }
  }

  void _lookup() {
    final locator = _locator;
    final latitude = double.tryParse(_latitudeController.text);
    final longitude = double.tryParse(_longitudeController.text);
    if (locator == null) {
      setState(() => _message = 'Boundary data is not ready yet.');
      return;
    }
    if (latitude == null || longitude == null) {
      setState(() => _message = 'Enter numeric latitude and longitude.');
      return;
    }
    try {
      final code = locator.lookup(
        latitude: latitude,
        longitude: longitude,
        format: _format,
      );
      setState(() => _message = code ?? 'No unambiguous land code');
    } on ArgumentError catch (error) {
      setState(() => _message = error.message.toString());
    }
  }

  @override
  void dispose() {
    _latitudeController.dispose();
    _longitudeController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Country code locator')),
      body: Center(
        child: ConstrainedBox(
          constraints: const BoxConstraints(maxWidth: 480),
          child: Padding(
            padding: const EdgeInsets.all(24),
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              crossAxisAlignment: CrossAxisAlignment.stretch,
              children: <Widget>[
                TextField(
                  controller: _latitudeController,
                  decoration: const InputDecoration(
                    border: OutlineInputBorder(),
                    labelText: 'Latitude',
                  ),
                  keyboardType: const TextInputType.numberWithOptions(
                    decimal: true,
                    signed: true,
                  ),
                ),
                const SizedBox(height: 16),
                TextField(
                  controller: _longitudeController,
                  decoration: const InputDecoration(
                    border: OutlineInputBorder(),
                    labelText: 'Longitude',
                  ),
                  keyboardType: const TextInputType.numberWithOptions(
                    decimal: true,
                    signed: true,
                  ),
                  onSubmitted: (_) => _lookup(),
                ),
                const SizedBox(height: 16),
                SegmentedButton<CountryCodeFormat>(
                  segments: const <ButtonSegment<CountryCodeFormat>>[
                    ButtonSegment(
                      value: CountryCodeFormat.alpha2,
                      label: Text('Alpha-2'),
                    ),
                    ButtonSegment(
                      value: CountryCodeFormat.alpha3,
                      label: Text('Alpha-3'),
                    ),
                  ],
                  selected: <CountryCodeFormat>{_format},
                  onSelectionChanged: (selected) {
                    setState(() => _format = selected.first);
                    if (_locator != null) _lookup();
                  },
                ),
                const SizedBox(height: 16),
                FilledButton(
                  onPressed: _locator == null ? null : _lookup,
                  child: const Text('Look up'),
                ),
                const SizedBox(height: 24),
                SelectableText(
                  _message,
                  textAlign: TextAlign.center,
                  style: Theme.of(context).textTheme.headlineSmall,
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}
0
likes
160
points
165
downloads

Documentation

API reference

Publisher

unverified uploader

Weekly Downloads

Offline WGS 84 coordinate to official ISO 3166-1 Alpha-2 or Alpha-3 country code lookup for Flutter.

Repository (GitHub)
View/report issues
Contributing

Topics

#country-codes #geolocation #iso-3166 #maps #offline

License

MIT (license)

Dependencies

flutter

More

Packages that depend on country_code_locator