Flutter谷歌地图集成插件flutter_google_map_sal的使用

Flutter谷歌地图集成插件flutter_google_map_sal的使用

获取开始

本项目是一个新的Flutter插件项目。该插件项目包含适用于Android和/或iOS的平台特定实现代码。

对于Flutter的入门帮助,可以查看我们的在线文档,其中提供了教程、示例、移动开发指导以及完整的API参考。

该项目是在未指定--platforms标志的情况下生成的,目前不支持任何平台。要添加平台,请在相同目录下运行以下命令:

flutter create -t plugin --platforms <platforms> .

您也可以在pubspec.yaml文件中找到如何添加平台的详细说明。

完整示例代码

以下是使用flutter_google_map_sal插件的完整示例代码:

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:google_api_headers/google_api_headers.dart';
import 'package:flutter_google_map_sal/flutter_google_map_sal.dart';
import 'package:google_maps_webservice/places.dart';
import 'package:uuid/uuid.dart';

const kGoogleApiKey = 'YOUR_API_KEY'; // 请替换为您的实际API密钥

void main() => runApp(const RoutesWidget());

final customTheme = ThemeData(
  primarySwatch: Colors.blue,
  brightness: Brightness.dark,
  colorScheme: ColorScheme.fromSwatch(
    primarySwatch: Colors.blue,
    brightness: Brightness.dark,
    accentColor: Colors.redAccent,
  ),
  inputDecorationTheme: const InputDecorationTheme(
    border: OutlineInputBorder(
      borderRadius: BorderRadius.all(Radius.circular(4.00)),
    ),
    contentPadding: EdgeInsets.symmetric(
      vertical: 12.50,
      horizontal: 10.00,
    ),
  ),
);

class RoutesWidget extends StatelessWidget {
  const RoutesWidget({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '我的应用',
      theme: customTheme,
      routes: {
        '/': (_) => const MyApp(),
        '/search': (_) => CustomSearchScaffold(),
      },
    );
  }
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  Mode _mode = Mode.overlay;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('我的应用'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            _buildDropdownMenu(),
            const SizedBox(height: 12),
            ElevatedButton(
              onPressed: _handlePressButton,
              child: const Text('搜索地点'),
            ),
            const SizedBox(height: 12),
            ElevatedButton(
              onPressed: () {
                Navigator.of(context).pushNamed('/search');
              },
              child: const Text('自定义'),
            ),
          ],
        ),
      ),
    );
  }

  Widget _buildDropdownMenu() {
    return DropdownButton<Mode>(
      value: _mode,
      items: const [
        DropdownMenuItem<Mode>(
          value: Mode.overlay,
          child: Text('覆盖层模式'),
        ),
        DropdownMenuItem<Mode>(
          value: Mode.fullscreen,
          child: Text('全屏模式'),
        ),
      ],
      onChanged: (m) {
        if (m != null) {
          setState(() => _mode = m);
        }
      },
    );
  }

  Future<void> _handlePressButton() async {
    void onError(PlacesAutocompleteResponse response) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(
          content: Text(response.errorMessage ?? '未知错误'),
        ),
      );
    }

    // 显示输入自动完成,并选择模式
    // 然后获取选中的Prediction
    final p = await PlacesAutocomplete.show(
      context: context,
      apiKey: kGoogleApiKey,
      onError: onError,
      mode: _mode,
      language: 'fr',
      components: [Component(Component.country, 'fr')],
    );

    await displayPrediction(p, ScaffoldMessenger.of(context));
  }
}

Future<void> displayPrediction(Prediction? p, ScaffoldMessengerState messengerState) async {
  if (p == null) {
    return;
  }

  // 获取详细信息(纬度/经度)
  final _places = GoogleMapsPlaces(
    apiKey: kGoogleApiKey,
    apiHeaders: await const GoogleApiHeaders().getHeaders(),
  );

  final detail = await _places.getDetailsByPlaceId(p.placeId!);
  final geometry = detail.result.geometry!;
  final lat = geometry.location.lat;
  final lng = geometry.location.lng;

  messengerState.showSnackBar(
    SnackBar(
      content: Text('${p.description} - $lat/$lng'),
    ),
  );
}

// 自定义搜索框架
// 基本上您的小部件需要扩展 [GooglePlacesAutocompleteWidget]
// 并且您的状态需要扩展 [GooglePlacesAutocompleteState]
class CustomSearchScaffold extends PlacesAutocompleteWidget {
  CustomSearchScaffold({Key? key})
      : super(
          key: key,
          apiKey: kGoogleApiKey,
          sessionToken: const Uuid().v4(),
          language: 'en',
          components: [Component(Component.country, 'uk')],
        );

  [@override](/user/override)
  _CustomSearchScaffoldState createState() => _CustomSearchScaffoldState();
}

class _CustomSearchScaffoldState extends PlacesAutocompleteState {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const AppBarPlacesAutoCompleteTextField(
          textStyle: null,
          textDecoration: null,
          cursorColor: null,
        ),
      ),
      body: PlacesAutocompleteResult(
        onTap: (p) => displayPrediction(p, ScaffoldMessenger.of(context)),
        logo: Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: const [FlutterLogo()],
        ),
      ),
    );
  }

  [@override](/user/override)
  void onResponseError(PlacesAutocompleteResponse response) {
    super.onResponseError(response);

    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(content: Text(response.errorMessage ?? '未知错误')),
    );
  }

  [@override](/user/override)
  void onResponse(PlacesAutocompleteResponse response) {
    super.onResponse(response);

    if (response.predictions.isNotEmpty) {
      ScaffoldMessenger.of(context).showSnackBar(
        const SnackBar(content: Text('收到回复')),
      );
    }
  }
}

更多关于Flutter谷歌地图集成插件flutter_google_map_sal的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter谷歌地图集成插件flutter_google_map_sal的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_google_maps_sal 是一个用于在 Flutter 应用中集成 Google 地图的插件。它提供了丰富的功能,允许开发者在应用中轻松地显示地图、添加标记、绘制路线等。以下是如何在 Flutter 项目中使用 flutter_google_maps_sal 插件的步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 flutter_google_maps_sal 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_google_maps_sal: ^latest_version

然后运行 flutter pub get 来获取依赖。

2. 获取 Google Maps API 密钥

要使用 Google 地图服务,你需要一个 Google Maps API 密钥。你可以按照以下步骤获取:

  1. 前往 Google Cloud Platform Console
  2. 创建一个新项目或选择一个现有项目。
  3. 导航到 API 和服务 > 凭据
  4. 点击 创建凭据,然后选择 API 密钥
  5. 复制生成的 API 密钥。

3. 配置 Android 和 iOS 项目

Android 配置

  1. 打开 android/app/src/main/AndroidManifest.xml 文件。
  2. <application> 标签内添加以下内容:
<meta-data
    android:name="com.google.android.geo.API_KEY"
    android:value="YOUR_ANDROID_API_KEY"/>

iOS 配置

  1. 打开 ios/Runner/AppDelegate.swift 文件。
  2. application(_:didFinishLaunchingWithOptions:) 方法中添加以下代码:
import GoogleMaps

GMSServices.provideAPIKey("YOUR_IOS_API_KEY")

4. 在 Flutter 中使用 flutter_google_maps_sal

以下是一个简单的示例,展示如何在 Flutter 应用中显示一个 Google 地图:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MapScreen(),
    );
  }
}

class MapScreen extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Google Maps Example'),
      ),
      body: GoogleMap(
        initialCameraPosition: CameraPosition(
          target: LatLng(37.42796133580664, -122.085749655962),
          zoom: 14.0,
        ),
        markers: {
          Marker(
            markerId: MarkerId('marker_1'),
            position: LatLng(37.42796133580664, -122.085749655962),
            infoWindow: InfoWindow(title: 'Marker Title', snippet: 'Marker Snippet'),
          ),
        },
        onMapCreated: (GoogleMapController controller) {
          // 你可以在这里处理地图创建后的逻辑
        },
      ),
    );
  }
}
回到顶部