geocoder 0.2.1 copy "geocoder: ^0.2.1" to clipboard
geocoder: ^0.2.1 copied to clipboard

Forward and reverse geocoding.

example/lib/main.dart

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:geocoder/geocoder.dart';
import 'package:geocoder/services/base.dart';
import 'widgets.dart';

void main() => runApp(new MyApp());

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => new _MyAppState();
}

class AppState extends InheritedWidget {
  const AppState({
    Key key,
    this.mode,
    Widget child,
  }) : assert(mode != null),
        assert(child != null),
        super(key: key, child: child);

  final Geocoding mode;

  static AppState of(BuildContext context) {
    return context.inheritFromWidgetOfExactType(AppState);
  }

  @override
  bool updateShouldNotify(AppState old) => mode != old.mode;
}

class GeocodeView extends StatefulWidget {

  GeocodeView();

  @override
  _GeocodeViewState createState() => new _GeocodeViewState();
}

class _GeocodeViewState extends State<GeocodeView> {

  _GeocodeViewState();

  final TextEditingController _controller = new TextEditingController();

  List<Address> results = [];

  bool isLoading = false;

  Future search() async {

    this.setState(() {
      this.isLoading = true;
    });

    try{
      var geocoding = AppState.of(context).mode;
      var results = await geocoding.findAddressesFromQuery(_controller.text);
      this.setState(() {
        this.results = results;
      });
    }
    catch(e) {
      print("Error occured: $e");
    }
    finally {
      this.setState(() {
        this.isLoading = false;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return new Column(
        children: <Widget>[
          new Card(
            child: new Padding(
              padding: const EdgeInsets.all(10.0),
              child: new Row(
                children: <Widget>[
                  new Expanded(
                    child: new TextField(
                      controller: _controller,
                      decoration: new InputDecoration(hintText: "Enter an address"),
                    ),
                  ),
                  new IconButton(icon: new Icon(Icons.search), onPressed: () => search())
                ],
              ),
            ),
          ),
          new Expanded(child: new AddressListView(this.isLoading, this.results)),
        ]);
  }
}

class ReverseGeocodeView extends StatefulWidget {

  ReverseGeocodeView();

  @override
  _ReverseGeocodeViewState createState() => new _ReverseGeocodeViewState();
}

class _ReverseGeocodeViewState extends State<ReverseGeocodeView> {

  final TextEditingController _controllerLongitude = new TextEditingController();
  final TextEditingController _controllerLatitude = new TextEditingController();

  _ReverseGeocodeViewState();

  List<Address> results = [];

  bool isLoading = false;

  Future search() async {


    this.setState(() {
      this.isLoading = true;
    });

    try{
      var geocoding = AppState.of(context).mode;
      var longitude = double.parse(_controllerLongitude.text);
      var latitude = double.parse(_controllerLatitude.text);
      var results = await geocoding.findAddressesFromCoordinates(new Coordinates(latitude, longitude));
      this.setState(() {
        this.results = results;
      });
    }
    catch(e) {
      print("Error occured: $e");
    }
    finally {
      this.setState(() {
        this.isLoading = false;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return new Column(
        children: <Widget>[
          new Card(
            child: new Padding(
              padding: const EdgeInsets.all(10.0),
              child: new Row(
                children: <Widget>[
                  new Expanded(
                    child: new Column(
                      children: <Widget>[
                        new TextField(
                          controller: _controllerLatitude,
                          decoration: new InputDecoration(hintText: "Latitude"),
                        ),
                        new TextField(
                          controller: _controllerLongitude,
                          decoration: new InputDecoration(hintText: "Longitude"),
                        ),
                      ],
                    ),
                  ),
                  new IconButton(icon: new Icon(Icons.search), onPressed: () => search())
                ],
              ),
            ),
          ),
          new Expanded(child: new AddressListView(this.isLoading, this.results)),
        ]);
  }
}

class _MyAppState extends State<MyApp> {

  Geocoding geocoding = Geocoder.local;

  final Map<String, Geocoding> modes = {
    "Local" : Geocoder.local,
    "Google (distant)" : Geocoder.google("<API-KEY>"),
  };

  void _changeMode(Geocoding mode) {
    this.setState(() {
      geocoding = mode;
    });
  }

  @override
  Widget build(BuildContext context) {
    return new AppState(
      mode: this.geocoding,
      child: new MaterialApp(
        home: new DefaultTabController(
          length: 2,
          child: new Scaffold(
            appBar: new AppBar(
              title: new Text('Geocoder'),
              actions: <Widget>[
                new PopupMenuButton<Geocoding>( // overflow menu
                  onSelected: _changeMode,
                  itemBuilder: (BuildContext context) {
                    return modes.keys.map((String mode) {
                      return new CheckedPopupMenuItem<Geocoding>(
                        checked: modes[mode] == this.geocoding,
                        value: modes[mode],
                        child: new Text(mode),
                      );
                    }).toList();
                  },
                ),
              ],
              bottom: new TabBar(
                tabs:  [
                   new Tab(
                    text: "Query",
                    icon: new Icon(Icons.search),
                  ),
                   new Tab(
                     text: "Coordinates",
                     icon: new Icon(Icons.pin_drop),
                   ),
                ],
              ),
            ),
            body: new TabBarView(
                children: <Widget>[
                  new GeocodeView(),
                  new ReverseGeocodeView(),
                ]),
          ),
        ),
      ),
    );
  }
}
274
likes
15
points
410
downloads

Publisher

verified publisheraloisdeniel.com

Weekly Downloads

Forward and reverse geocoding.

Repository (GitHub)

License

unknown (license)

Dependencies

flutter, meta

More

Packages that depend on geocoder

Packages that implement geocoder