Flutter地点选择插件place_pickarte的使用

Flutter地点选择插件place_pickarte的使用

place_pickarte

place_pickarte 是一个高度自定义的、艺术感十足的地点选择器插件,支持通过内置UI组件实现像素级定制。目前支持Google Maps,Openstreet和Mapbox将在未来版本中加入。

cover_picture

##📐 特性

  • 支持Google Maps。
  • 提供像素级定制功能。
  • 内置UI组件,易于集成和使用。

##🚀 动机

该插件的创建动机是为了满足开发者对地点选择器的高度自定义需求,同时提供简单易用的界面。

##🕹️ 使用

开始使用

在项目中引入插件后,可以通过以下步骤快速集成地点选择功能:

  1. pubspec.yaml文件中添加依赖:
dependencies:
  place_pickarte: ^版本号
  1. 导入必要的包并在主应用中使用:
import 'package:place_pickarte/place_pickarte.dart';

完整示例

以下是一个完整的示例代码,展示如何使用place_pickarte插件来选择地点并获取详细信息。

示例代码:main.dart

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

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Place Pickarte',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        useMaterial3: true,
        appBarTheme: const AppBarTheme(
          centerTitle: true,
        ),
      ),
      home: const HomePage(),
    );
  }
}

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

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  GeocodingResult? _pickedPlace;

  @override
  void setState(VoidCallback fn) {
    if (mounted) {
      super.setState(fn);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Artistic Place Picker'),
      ),
      body: Column(
        children: [
          ListTile(
            title: Text(
              '${_pickedPlace?.formattedAddress.asValidString}',
            ),
            subtitle: const Text('Formatted address'),
          ),
          ListTile(
            title: Text(
              '${_pickedPlace?.details.city.asValidString}',
            ),
            subtitle: const Text('City'),
          ),
          ListTile(
            title: Text(
              '${_pickedPlace?.details.streetName.asValidString}',
            ),
            subtitle: const Text('Street name'),
          ),
          ListTile(
            title: Text(
              '${_pickedPlace?.details.streetNumber.asValidString}',
            ),
            subtitle: const Text('Street number'),
          ),
          ListTile(
            title: Text(
              '${_pickedPlace?.details.countryName.asValidString}',
            ),
            subtitle: const Text('Country'),
          ),
          ListTile(
            title: Text(
              '${_pickedPlace?.details.addressLine.asValidString}',
            ),
            subtitle: const Text('Address line'),
          ),
          ListTile(
            title: Text(
              '${_pickedPlace?.partialMatch.toString().asValidString}',
            ),
            subtitle: const Text('Partial match?'),
            trailing: IconButton(
              onPressed: () {
                showDialog(
                  context: context,
                  builder: (_) => AlertDialog(
                    title: const Text('What is partial match?'),
                    content: const Text(
                      'Partial_match indicates that the geocoder did not return an exact match for the original request, though it was able to match part of the requested address. You may wish to examine the original request for misspellings and/or an incomplete address',
                    ),
                    actions: [
                      TextButton(
                        onPressed: Navigator.of(context).pop,
                        child: const Text('Owkey!'),
                      ),
                    ],
                  ),
                );
              },
              icon: const Icon(
                Icons.info_outline_rounded,
                color: Colors.grey,
              ),
            ),
          ),
        ],
      ),
      floatingActionButton: ButtonBar(
        children: [
          ElevatedButton.icon(
            onPressed: () async {
              final result = await Navigator.of(context).push(
                MaterialPageRoute(
                  builder: (_) => const CustomizedPlacePicker(),
                ),
              );

              setState(() => _pickedPlace = result);
            },
            icon: const Icon(Icons.format_paint_rounded),
            label: const Text('Customized sample'),
          ),
          ElevatedButton.icon(
            onPressed: null,
            icon: const Icon(Icons.map),
            label: const Text('Prestyled sample'),
          ),
        ],
      ),
    );
  }
}

说明

  1. 依赖导入

    import 'package:place_pickarte/place_pickarte.dart';
    
  2. 主应用配置

    void main() {
      runApp(const MyApp());
    }
    
  3. 自定义地点选择器

    ElevatedButton.icon(
      onPressed: () async {
        final result = await Navigator.of(context).push(
          MaterialPageRoute(
            builder: (_) => const CustomizedPlacePicker(),
          ),
        );
    
        setState(() => _pickedPlace = result);
      },
      icon: const Icon(Icons.format_paint_rounded),
      label: const Text('Customized sample'),
    ),
    
  4. 获取地点信息

    ListTile(
      title: Text('${_pickedPlace?.formattedAddress.asValidString}'),
      subtitle: const Text('Formatted address'),
    ),
    

更多关于Flutter地点选择插件place_pickarte的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter地点选择插件place_pickarte的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


place_picker 是一个用于在 Flutter 应用中实现地点选择的插件。它允许用户通过 Google Maps 选择地点,并返回所选地点的详细信息,如经纬度、地址等。

以下是如何在 Flutter 项目中使用 place_picker 插件的步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 place_picker 依赖:

dependencies:
  flutter:
    sdk: flutter
  place_picker: ^2.0.0-nullsafety.0

然后运行 flutter pub get 来安装依赖。

2. 配置 Google Maps API

为了使用 place_picker,你需要一个 Google Maps API 密钥。你可以从 Google Cloud Console 获取该密钥。确保启用了以下 API:

  • Google Maps JavaScript API
  • Places API

android/app/src/main/AndroidManifest.xml 文件中添加你的 API 密钥:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

    <application
        android:label="Your App"
        android:icon="@mipmap/ic_launcher">

        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="YOUR_API_KEY_HERE"/>

    </application>
</manifest>

对于 iOS,在 ios/Runner/AppDelegate.swift 文件中添加以下代码:

import UIKit
import Flutter
import GoogleMaps

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

3. 使用 PlacePicker

在你的 Flutter 应用中使用 PlacePicker 来选择地点。以下是一个简单的示例:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Place Picker Demo',
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Place Picker Demo'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            LocationResult result = await Navigator.of(context).push(
              MaterialPageRoute(
                builder: (context) => PlacePicker(
                  "YOUR_API_KEY_HERE",
                  displayLocation: LatLng(37.4219999, -122.0840575), // 默认显示的位置
                ),
              ),
            );

            if (result != null) {
              print("Selected Place: ${result.formattedAddress}");
              print("Latitude: ${result.latLng.latitude}");
              print("Longitude: ${result.latLng.longitude}");
            }
          },
          child: Text('Pick a Place'),
        ),
      ),
    );
  }
}
回到顶部