FluuterからGoogle Map APIを呼び出してみます。
前提としてGoogleアカウントがあり、ログインしていること。
Google Maps Platform APIキーの取得
Google Cloud Platformを開き、「プロジェクトを作成」リンクを選択します。
プロジェクト名を入力して「作成」ボタンを選択します。
「→APIの概要に移動」を選択します。
「ライブラリ」を選択します。
「Maps JavaScript API」を選択します。
「有効にする」を選択します。
同様に「Maps SDK for Android」「Maps SDK for iOS」も有効にします。
「認証情報」を選択します。
「認証情報を作成」「APIキー」を選択します。
また、作成されたAPIキーに「APIキーの制限」を設定します。
キーを利用するAPIに適したキーの制限を行います。
キーの制限を行わずにAPIキーを利用した場合、外部にキー情報が洩れると悪意のあるユーザに利用されてしまう恐れがあるのでご注意下さい。
下記から適切な制限を選択して設定を保存して下さい。
- HTTPリファラー(ウェブサイト)
HTTP リファラーによる制限 - IPアドレス(ウェブサーバー、crronジョブなど)
IP アドレスによる制限 - Androidアプリ
パッケージ名およびフィンガープリントによる制限 - iOSアプリ
iOS バンドル識別子による制限
flutterプロジェクトを作成
$ flutter create --org jp.a12345 mymap
flutterプロジェクトにGoogle Mapパッケージを追加
flutterプロジェクトルートディレクトリにて以下のコマンドを実行します。
$ flutter pub add google_maps_flutter
$ flutter pub add google_maps_flutter_web
WebでのGoogle Map API設定
web/index.htmlに以下を追加します。
<script src="https://maps.googleapis.com/maps/api/js?key=MY_API_KEY"></script>
androidでのGoogle Map API設定
android/app/src/main/AndroidManifest.xml に以下を追加します。
<meta-data android:name="com.google.android.geo.API_KEY" android:value="MY_API_KEY"/>
また、以下を修正します。
minSdkVersion 20
iOSでのGoogle Map API設定
ios/Runner/AppDelegate.swift に以下を追加します。
import GoogleMaps GMSServices.provideAPIKey("MY_API_KEY")
main.dartの編集
lib/main.dart を以下のように編集します。
import 'dart:async'; import 'package:flutter/material.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Google Maps Demo', home: MapSample(), ); } } class MapSample extends StatefulWidget { @override State<MapSample> createState() => MapSampleState(); } class MapSampleState extends State<MapSample> { Completer<GoogleMapController> _controller = Completer(); static final CameraPosition _kGooglePlex = CameraPosition( target: LatLng(37.42796133580664, -122.085749655962), zoom: 14.4746, ); static final CameraPosition _kLake = CameraPosition( bearing: 192.8334901395799, target: LatLng(37.43296265331129, -122.08832357078792), tilt: 59.440717697143555, zoom: 19.151926040649414); @override Widget build(BuildContext context) { return new Scaffold( body: GoogleMap( mapType: MapType.hybrid, initialCameraPosition: _kGooglePlex, onMapCreated: (GoogleMapController controller) { _controller.complete(controller); }, ), floatingActionButton: FloatingActionButton.extended( onPressed: _goToTheLake, label: Text('To the lake!'), icon: Icon(Icons.directions_boat), ), ); } Future<void> _goToTheLake() async { final GoogleMapController controller = await _controller.future; controller.animateCamera(CameraUpdate.newCameraPosition(_kLake)); } }
アプリのテスト
Web、android、iOSでそれぞれテストしてみます。
コメント