Google Haritalar'ı Flutter uygulamasına ekleme

1. Giriş

Flutter, iOS ve Android'de yüksek kaliteli yerel deneyimler oluşturmak için Google'ın mobil uygulama SDK'sıdır.

Google Haritalar Flutter eklentisi ile uygulamanıza Google Haritalar verilerine dayalı haritalar ekleyebilirsiniz. Eklenti, Google Haritalar sunucularına erişimi, harita görüntülemeyi ve tıklama ile sürükleme gibi kullanıcı hareketlerine yanıt vermeyi otomatik olarak yönetir. Haritanıza işaretçi de ekleyebilirsiniz. Bu nesneler, harita konumları için ek bilgiler sağlar ve kullanıcının haritayla etkileşim kurmasına olanak tanır.

Ne oluşturacaksınız?

Bu codelab'de, Flutter SDK'sını kullanarak Google Haritası içeren bir mobil uygulama oluşturacaksınız. Uygulamanız şunları yapabilecek:

  • Bir Google Haritası Görüntüleyin
  • Web hizmetinden harita verilerini alma
  • Bu verileri haritada işaretçi olarak göster

Mountain View'ın vurgulandığı bir iPhone simülatöründe çalışan Google Haritası'nın bulunduğu Flutter uygulamasının ekran görüntüsü

Flutter nedir?

Flutter'ın üç temel özelliği vardır.

  • Hızlı geliştirme: Stateful Hot Reload ile Android ve iOS uygulamalarınızı milisaniyeler içinde oluşturun.
  • İfade edici ve esnek: Yerel son kullanıcı deneyimlerine odaklanarak özellikleri hızlı bir şekilde kullanıma sunun.
  • Hem iOS hem de Android'de yerel performans: Flutter'ın widget'ları, tam yerel performans sağlamak için kaydırma, gezinme, simgeler ve yazı tipleri gibi tüm kritik platform farklılıklarını içerir.

Google Haritalar'da:

  • Dünyanın% 99'unu kapsar: 200'den fazla ülke ve bölgeye ait güvenilir, kapsamlı verilerle çözüm derleyin.
  • Günde 25 milyon güncelleme: Doğru ve gerçek zamanlı konum verilerine ulaşın.
  • Aylık 1 milyar etkin kullanıcı sayısı: Google Haritalar'ın altyapısından destek alarak güvenle ölçekleme yapın.

Bu codelab, hem iOS hem de Android için bir Flutter uygulamasında Google Haritalar deneyimi oluşturma konusunda size yol gösterir.

Neler öğreneceksiniz?

  • Yeni bir Flutter uygulaması oluşturma
  • Google Haritalar Flutter eklentisini yapılandırma
  • Bir web hizmetinden alınan konum verilerini kullanarak haritaya işaretçi ekleme

Bu codelab'de, Flutter uygulamasına Google Haritası ekleme konusu ele alınmaktadır. Alakalı olmayan kavramlar ve kod blokları işaretlenmiştir ve yalnızca kopyalayıp yapıştırmanız için kullanımınıza sunulmuştur.

Bu codelab'den ne öğrenmek istiyorsunuz?

Konuya yeni başlıyorum ve iyi bir genel bakış istiyorum. Bu konu hakkında bilgi sahibiyim ancak bilgilerimi tazelemek istiyorum. Projemde kullanmak için örnek kod arıyorum. Belirli bir şeyin açıklamasını arıyorum.

2. Flutter ortamınızı kurma

Bu laboratuvarı tamamlamak için iki yazılım gerekir: Flutter SDK ve bir düzenleyici. Bu codelab'de Android Studio'nun kullanıldığı varsayılsa da istediğiniz düzenleyiciyi kullanabilirsiniz.

Bu codelab'i aşağıdaki cihazlardan herhangi birini kullanarak çalıştırabilirsiniz:

  • Bilgisayarınıza bağlı ve geliştirici moduna ayarlanmış fiziksel bir cihaz (Android veya iOS)
  • iOS simülasyon aracı. (Xcode araçlarının yüklenmesi gerekir.)
  • Android emülatörü. (Android Studio'da kurulum gerektirir.)

3. Başlarken

Flutter'ı kullanmaya başlama

Flutter'ı kullanmaya başlamanın en kolay yolu, basit bir başlangıç deneyimi için gereken tüm kodları oluşturmak üzere flutter komut satırı aracını kullanmaktır.

$ flutter create google_maps_in_flutter --platforms android,ios,web
Creating project google_maps_in_flutter...
Resolving dependencies in `google_maps_in_flutter`... 
Downloading packages... 
Got dependencies in `google_maps_in_flutter`.
Wrote 81 files.

All done!
You can find general documentation for Flutter at: https://docs.flutter.dev/
Detailed API documentation is available at: https://api.flutter.dev/
If you prefer video documentation, consider: https://www.youtube.com/c/flutterdev

In order to run your application, type:

  $ cd google_maps_in_flutter
  $ flutter run

Your application code is in google_maps_in_flutter/lib/main.dart.

Google Haritalar Flutter eklentisini bağımlılık olarak ekleme

Pub paketlerini kullanarak Flutter uygulamasına ek özellikler eklemek kolaydır. Bu codelab'de, proje dizininden aşağıdaki komutu çalıştırarak Google Haritalar Flutter eklentisini tanıtıyorsunuz.

$ cd google_maps_in_flutter
$ flutter pub add google_maps_flutter
Resolving dependencies... 
Downloading packages... 
+ csslib 1.0.0
+ flutter_plugin_android_lifecycle 2.0.19
+ flutter_web_plugins 0.0.0 from sdk flutter
+ google_maps 7.1.0
+ google_maps_flutter 2.6.1
+ google_maps_flutter_android 2.8.0
+ google_maps_flutter_ios 2.6.0
+ google_maps_flutter_platform_interface 2.6.0
+ google_maps_flutter_web 0.5.7
+ html 0.15.4
+ js 0.6.7 (0.7.1 available)
+ js_wrapping 0.7.4
  leak_tracker 10.0.4 (10.0.5 available)
  leak_tracker_flutter_testing 3.0.3 (3.0.5 available)
  material_color_utilities 0.8.0 (0.11.1 available)
  meta 1.12.0 (1.14.0 available)
+ plugin_platform_interface 2.1.8
+ sanitize_html 2.1.0
+ stream_transform 2.1.0
  test_api 0.7.0 (0.7.1 available)
+ web 0.5.1
Changed 16 dependencies!
6 packages have newer versions incompatible with dependency constraints.
Try `flutter pub outdated` for more information.

iOS'i yapılandırma platform

iOS'te Google Haritalar SDK'sının en son sürümünü edinmek için minimum iOS 14 platform sürümü gerekir. ios/Podfile yapılandırma dosyasının üst kısmını aşağıdaki gibi değiştirin.

ios/Podfile

# Google Maps SDK requires platform version 14
# https://developers.google.com/maps/flutter-package/config#ios
platform :ios, '14.0'


# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'

Android minSDK yapılandırma

Google Haritalar SDK'sını Android'de kullanmak için minSdk değerinin 21 olarak ayarlanması gerekir. android/app/build.gradle yapılandırma dosyasını aşağıdaki gibi değiştirin.

android/app/build.gradle

android {
    defaultConfig {
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        applicationId = "com.example.google_maps_in_flutter"
        // Minimum Android version for Google Maps SDK
        // https://developers.google.com/maps/flutter-package/config#android
        minSdk = 21
        targetSdk = flutter.targetSdkVersion
        versionCode = flutterVersionCode.toInteger()
        versionName = flutterVersionName
    }

}

4. Uygulamaya Google Haritalar'ı ekleme

Her şey API anahtarlarıyla ilgili

Flutter uygulamanızda Google Haritalar'ı kullanmak için Google Haritalar Platformu ile bir API projesi yapılandırmanız gerekir. Bu işlem için Android için Haritalar SDK'sında API anahtarı kullanma, iOS için Haritalar SDK'sında API anahtarı kullanma ve Maps JavaScript API'de API anahtarı kullanma kılavuzlarını inceleyin. API anahtarlarını kullanarak hem Android hem de iOS uygulamalarını yapılandırmak için aşağıdaki adımları uygulayın.

Android uygulaması için API anahtarı ekleme

Android uygulamasına API anahtarı eklemek için AndroidManifest.xml dosyasını android/app/src/main içinde düzenleyin. application düğümünün içine, önceki adımda oluşturulan API anahtarını içeren tek bir meta-data girişi ekleyin.

android/app/src/main/AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application
        android:label="google_maps_in_flutter"
        android:name="${applicationName}"
        android:icon="@mipmap/ic_launcher">

        <!-- TODO: Add your Google Maps API key here -->
        <meta-data android:name="com.google.android.geo.API_KEY"
               android:value="YOUR-KEY-HERE"/>

        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:launchMode="singleTop"
            android:taskAffinity=""
            android:theme="@style/LaunchTheme"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:windowSoftInputMode="adjustResize">
            <!-- Specifies an Android theme to apply to this Activity as soon as
                 the Android process has started. This theme is visible to the user
                 while the Flutter UI initializes. After that, this theme continues
                 to determine the Window background behind the Flutter UI. -->
            <meta-data
              android:name="io.flutter.embedding.android.NormalTheme"
              android:resource="@style/NormalTheme"
              />
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <!-- Don't delete the meta-data below.
             This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
        <meta-data
            android:name="flutterEmbedding"
            android:value="2" />
    </application>
    <!-- Required to query activities that can process text, see:
         https://developer.android.com/training/package-visibility and
         https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.

         In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
    <queries>
        <intent>
            <action android:name="android.intent.action.PROCESS_TEXT"/>
            <data android:mimeType="text/plain"/>
        </intent>
    </queries>
</manifest>

iOS uygulaması için API anahtarı ekleme

iOS uygulamasına API anahtarı eklemek için ios/Runner içindeki AppDelegate.swift dosyasını düzenleyin. Android'in aksine, iOS'te API anahtarı eklemek için Runner uygulamasının kaynak kodunda değişiklik yapılması gerekir. AppDelegate, uygulama başlatma sürecinin bir parçası olan temel singleton'dur.

Bu dosyada iki değişiklik yapın. Öncelikle Google Haritalar üstbilgilerini çekmek için bir #import ifadesi ekleyin, ardından GMSServices tekil öğesinin provideAPIKey() yöntemini çağırın. Bu API anahtarı, Google Haritalar'ın harita parçalarını doğru şekilde sunmasını sağlar.

ios/Runner/AppDelegate.swift

import Flutter
import UIKit
import GoogleMaps                                          // Add this import

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GeneratedPluginRegistrant.register(with: self)

    // TODO: Add your Google Maps API key
    GMSServices.provideAPIKey("YOUR-API-KEY")               // Add this line

    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

Web uygulaması için API anahtarı ekleme

Web uygulamasına API anahtarı eklemek için web içindeki index.html dosyasını düzenleyin. Başlık bölümüne, API anahtarınızla birlikte Maps JavaScript komut dosyasına bir referans ekleyin.

web/index.html

<!DOCTYPE html>
<html>
<head>
  <!--
    If you are serving your web app in a path other than the root, change the
    href value below to reflect the base path you are serving from.

    The path provided below has to start and end with a slash "/" in order for
    it to work correctly.

    For more details:
    * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base

    This is a placeholder for base href that will be replaced by the value of
    the `--base-href` argument provided to `flutter build`.
  -->
  <base href="$FLUTTER_BASE_HREF">

  <meta charset="UTF-8">
  <meta content="IE=Edge" http-equiv="X-UA-Compatible">
  <meta name="description" content="A new Flutter project.">

  <!-- iOS meta tags & icons -->
  <meta name="apple-mobile-web-app-capable" content="yes">
  <meta name="apple-mobile-web-app-status-bar-style" content="black">
  <meta name="apple-mobile-web-app-title" content="google_maps_in_flutter">
  <link rel="apple-touch-icon" href="icons/Icon-192.png">

  <!-- Favicon -->
  <link rel="icon" type="image/png" href="favicon.png"/>

  <!-- Add your Google Maps API key here -->
  <script src="https://maps.googleapis.com/maps/api/js?key=YOUR-KEY-HERE"></script>

  <title>google_maps_in_flutter</title>
  <link rel="manifest" href="manifest.json">
</head>
<body>
  <script src="flutter_bootstrap.js" async></script>
</body>
</html>

Ekrana harita yerleştirme

Şimdi ekrana bir harita getirme zamanı. lib/main.dart dosyasının içeriğini aşağıdakiyle değiştirin.

lib/main.dart

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

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

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

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late GoogleMapController mapController;

  final LatLng _center = const LatLng(45.521563, -122.677433);

  void _onMapCreated(GoogleMapController controller) {
    mapController = controller;
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        useMaterial3: true,
        colorSchemeSeed: Colors.green[700],
      ),
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Maps Sample App'),
          elevation: 2,
        ),
        body: GoogleMap(
          onMapCreated: _onMapCreated,
          initialCameraPosition: CameraPosition(
            target: _center,
            zoom: 11.0,
          ),
        ),
      ),
    );
  }
}

Uygulamayı çalıştırma

Portland'ı merkezine alan tek bir harita görünümü görmek için Flutter uygulamasını iOS veya Android'de çalıştırın. Alternatif olarak, bir Android emülatörü veya iOS simülatörü çalıştırın. Harita merkezini, yaşadığınız şehri veya sizin için önemli bir yeri gösterecek şekilde değiştirebilirsiniz.

$ flutter run

iPhone simülatöründe çalışan bir Google Haritası içeren Flutter uygulamasının ekran görüntüsü

Android emülatöründe çalışan bir Google Haritası içeren Flutter uygulamasının ekran görüntüsü

5. Google'ı Haritaya Yerleştirme

Google'ın Kuzey Amerika, Latin Amerika, Avrupa, Asya Pasifik ve Afrika ile Orta Doğu'da olmak üzere dünyanın dört bir yanında ofisleri vardır. Bu haritaların güzel yanı, incelerseniz ofis konumu bilgilerini JSON biçiminde sağlamak için kolayca kullanılabilir bir API uç noktasına sahip olmalarıdır. Bu adımda, bu ofis konumlarını haritaya yerleştirirsiniz. Bu adımda, JSON'u ayrıştırmak için kod oluşturma özelliğini kullanacaksınız.

Projeye aşağıdaki gibi üç yeni Flutter bağımlılığı ekleyin. HTTP isteklerini kolayca yapmak için http paketini, JSON dokümanlarını temsil eden nesne yapısını bildirmek için json_serializable ve json_annotation paketlerini, kod oluşturma desteği için build_runner paketini ekleyin.

$ flutter pub add http json_annotation json_serializable dev:build_runner
Resolving dependencies... 
Downloading packages... 
+ _fe_analyzer_shared 67.0.0 (68.0.0 available)
+ analyzer 6.4.1 (6.5.0 available)
+ args 2.5.0
+ build 2.4.1
+ build_config 1.1.1
+ build_daemon 4.0.1
+ build_resolvers 2.4.2
+ build_runner 2.4.9
+ build_runner_core 7.3.0
+ built_collection 5.1.1
+ built_value 8.9.2
+ checked_yaml 2.0.3
+ code_builder 4.10.0
+ convert 3.1.1
+ crypto 3.0.3
+ dart_style 2.3.6
+ file 7.0.0
+ fixnum 1.1.0
+ frontend_server_client 4.0.0
+ glob 2.1.2
+ graphs 2.3.1
+ http 1.2.1
+ http_multi_server 3.2.1
+ http_parser 4.0.2
+ io 1.0.4
  js 0.6.7 (0.7.1 available)
+ json_annotation 4.9.0
+ json_serializable 6.8.0
  leak_tracker 10.0.4 (10.0.5 available)
  leak_tracker_flutter_testing 3.0.3 (3.0.5 available)
+ logging 1.2.0
  material_color_utilities 0.8.0 (0.11.1 available)
  meta 1.12.0 (1.14.0 available)
+ mime 1.0.5
+ package_config 2.1.0
+ pool 1.5.1
+ pub_semver 2.1.4
+ pubspec_parse 1.2.3
+ shelf 1.4.1
+ shelf_web_socket 1.0.4
+ source_gen 1.5.0
+ source_helper 1.3.4
  test_api 0.7.0 (0.7.1 available)
+ timing 1.0.1
+ typed_data 1.3.2
+ watcher 1.1.0
+ web_socket_channel 2.4.5
+ yaml 3.1.2
Changed 42 dependencies!
8 packages have newer versions incompatible with dependency constraints.
Try `flutter pub outdated` for more information.

Kod oluşturma ile JSON ayrıştırma

API uç noktasından döndürülen JSON verilerinin düzenli bir yapısı olduğunu fark etmiş olabilirsiniz. Bu verileri kodda kullanabileceğiniz nesnelere dönüştürmek için kodu oluşturmak faydalı olacaktır.

lib/src dizininde bir locations.dart dosyası oluşturun ve döndürülen JSON verilerinin yapısını aşağıdaki gibi açıklayın:

lib/src/locations.dart

import 'dart:convert';

import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart' show rootBundle;
import 'package:http/http.dart' as http;
import 'package:json_annotation/json_annotation.dart';

part 'locations.g.dart';

@JsonSerializable()
class LatLng {
  LatLng({
    required this.lat,
    required this.lng,
  });

  factory LatLng.fromJson(Map<String, dynamic> json) => _$LatLngFromJson(json);
  Map<String, dynamic> toJson() => _$LatLngToJson(this);

  final double lat;
  final double lng;
}

@JsonSerializable()
class Region {
  Region({
    required this.coords,
    required this.id,
    required this.name,
    required this.zoom,
  });

  factory Region.fromJson(Map<String, dynamic> json) => _$RegionFromJson(json);
  Map<String, dynamic> toJson() => _$RegionToJson(this);

  final LatLng coords;
  final String id;
  final String name;
  final double zoom;
}

@JsonSerializable()
class Office {
  Office({
    required this.address,
    required this.id,
    required this.image,
    required this.lat,
    required this.lng,
    required this.name,
    required this.phone,
    required this.region,
  });

  factory Office.fromJson(Map<String, dynamic> json) => _$OfficeFromJson(json);
  Map<String, dynamic> toJson() => _$OfficeToJson(this);

  final String address;
  final String id;
  final String image;
  final double lat;
  final double lng;
  final String name;
  final String phone;
  final String region;
}

@JsonSerializable()
class Locations {
  Locations({
    required this.offices,
    required this.regions,
  });

  factory Locations.fromJson(Map<String, dynamic> json) =>
      _$LocationsFromJson(json);
  Map<String, dynamic> toJson() => _$LocationsToJson(this);

  final List<Office> offices;
  final List<Region> regions;
}

Future<Locations> getGoogleOffices() async {
  const googleLocationsURL = 'https://about.google/static/data/locations.json';

  // Retrieve the locations of Google offices
  try {
    final response = await http.get(Uri.parse(googleLocationsURL));
    if (response.statusCode == 200) {
      return Locations.fromJson(
          json.decode(response.body) as Map<String, dynamic>);
    }
  } catch (e) {
    if (kDebugMode) {
      print(e);
    }
  }

  // Fallback for when the above HTTP request fails.
  return Locations.fromJson(
    json.decode(
      await rootBundle.loadString('assets/locations.json'),
    ) as Map<String, dynamic>,
  );
}

Bu kodu ekledikten sonra, IDE'niz (kullanıyorsanız) var olmayan bir kardeş dosyaya başvurduğu için bazı kırmızı dalgalı çizgiler göstermelidir. locations.g.dart. Bu oluşturulan dosya, türsüz JSON yapıları ile adlandırılmış nesneler arasında dönüşüm yapar. Aşağıdaki gibi build_runner komutunu çalıştırarak oluşturun:

$ dart run build_runner build --delete-conflicting-outputs
[INFO] Generating build script...
[INFO] Generating build script completed, took 357ms

[INFO] Creating build script snapshot......
[INFO] Creating build script snapshot... completed, took 10.5s

[INFO] There was output on stdout while compiling the build script snapshot, run with `--verbose` to see it (you will need to run a `clean` first to re-snapshot).

[INFO] Initializing inputs
[INFO] Building new asset graph...
[INFO] Building new asset graph completed, took 646ms

[INFO] Checking for unexpected pre-existing outputs....
[INFO] Deleting 1 declared outputs which already existed on disk.
[INFO] Checking for unexpected pre-existing outputs. completed, took 3ms

[INFO] Running build...
[INFO] Generating SDK summary...
[INFO] 3.4s elapsed, 0/3 actions completed.
[INFO] Generating SDK summary completed, took 3.4s

[INFO] 4.7s elapsed, 2/3 actions completed.
[INFO] Running build completed, took 4.7s

[INFO] Caching finalized dependency graph...
[INFO] Caching finalized dependency graph completed, took 36ms

[INFO] Succeeded after 4.8s with 2 outputs (7 actions)

Kodunuz artık tekrar sorunsuz bir şekilde analiz edilmelidir. Ardından, getGoogleOffices işlevinde kullanılan yedek locations.json dosyasını eklememiz gerekir. Bu yedek işlevin eklenmesinin nedenlerinden biri, bu işlevde yüklenen statik verilerin CORS başlıkları olmadan sunulması ve bu nedenle web tarayıcısında yüklenememesidir. Android ve iOS Flutter uygulamaları için CORS başlıkları gerekmez ancak mobil veri erişimi en iyi zamanlarda bile sorunlu olabilir.

Tarayıcınızda https://about.google/static/data/locations.json adresine gidin ve içeriği öğe dizinine kaydedin. Alternatif olarak, komut satırını aşağıdaki gibi kullanabilirsiniz.

$ mkdir assets
$ cd assets
$ curl -o locations.json https://about.google/static/data/locations.json
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 30348  100 30348    0     0  75492      0 --:--:-- --:--:-- --:--:-- 75492

Öğe dosyasını indirdikten sonra pubspec.yaml dosyanızın Flutter bölümüne ekleyin.

pubspec.yaml

flutter:
  uses-material-design: true

  assets:
    - assets/locations.json

Harita verilerini istemek için main.dart dosyasını değiştirin, ardından döndürülen bilgileri kullanarak haritaya ofis ekleyin:

lib/main.dart

import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'src/locations.dart' as locations;

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

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

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final Map<String, Marker> _markers = {};
  Future<void> _onMapCreated(GoogleMapController controller) async {
    final googleOffices = await locations.getGoogleOffices();
    setState(() {
      _markers.clear();
      for (final office in googleOffices.offices) {
        final marker = Marker(
          markerId: MarkerId(office.name),
          position: LatLng(office.lat, office.lng),
          infoWindow: InfoWindow(
            title: office.name,
            snippet: office.address,
          ),
        );
        _markers[office.name] = marker;
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        useMaterial3: true,
        colorSchemeSeed: Colors.green[700],
      ),
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Google Office Locations'),
          elevation: 2,
        ),
        body: GoogleMap(
          onMapCreated: _onMapCreated,
          initialCameraPosition: const CameraPosition(
            target: LatLng(0, 0),
            zoom: 2,
          ),
          markers: _markers.values.toSet(),
        ),
      ),
    );
  }
}

Bu kod çeşitli işlemler gerçekleştirir:

  • _onMapCreated, yüklenene kadar awaiting önceki adımdaki JSON ayrıştırma kodunu kullanır. Ardından, döndürülen verileri kullanarak setState() geri çağırma işlevi içinde Marker oluşturur. Uygulama yeni işaretçiler aldığında setState, Flutter'a ekranı yeniden çizmesini bildirir ve ofis konumlarının gösterilmesini sağlar.
  • İşaretçiler, GoogleMap widget'ıyla ilişkili bir Map içinde depolanır. Bu işlem, işaretçileri doğru haritaya bağlar. Elbette birden fazla haritanız olabilir ve her birinde farklı işaretçiler gösterebilirsiniz.

Mountain View&#39;ın vurgulandığı bir iPhone simülatöründe çalışan Google Haritası&#39;nın bulunduğu Flutter uygulamasının ekran görüntüsü

Başarılarınızın ekran görüntüsünü burada bulabilirsiniz. Bu noktada birçok ilginç ekleme yapılabilir. Örneğin, kullanıcı bir ofisi tıkladığında haritayı hareket ettiren ve yakınlaştıran bir ofis liste görünümü ekleyebilirsiniz. Ancak bu alıştırmayı okuyucuya bırakıyoruz.

6. Sonraki adımlar

Tebrikler!

Codelab'i tamamladınız ve Google Harita içeren bir Flutter uygulaması oluşturdunuz. Ayrıca bir JSON web hizmetiyle de etkileşimde bulundunuz.

Diğer sonraki adımlar

Bu codelab'de, haritadaki bir dizi noktayı görselleştirmek için bir deneyim oluşturulmuştur. Bu özellikten yararlanarak birçok farklı kullanıcı ihtiyacını karşılayan çeşitli mobil uygulamalar vardır. Bu konuda daha fazla bilgi edinmek için yararlanabileceğiniz diğer kaynaklar: