地址搜索字段

Widget 构建器,用于创建“地址搜索小部件”,帮助通过引用自动完成地址。它们可用于获取两个地点之间的路线,并可选择途经点。这些小部件设计用于在 TextField 中通过 onTap 使用 showDialog 函数显示。它使用了 HTTP 和 Flutter 的 Google Maps 插件。(最后一个插件用于使用可与 GoogleMap Widget 一起使用的扩展对象)。

入门

要使用此插件,请将 address_search_field 添加到您的 pubspec.yaml 文件中作为 依赖项。例如

dependencies:
  address_search_field: ^3.0.5

权限

Android

在 Android 上,您需要在 Android Manifest 文件(位于 android/app/src/main)中添加 internet 权限。为此,请将以下几行作为 manifest> 标签的直接子项添加

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

iOS

在 iOS 上,您需要在 Info.plist 文件(位于 ios/Runner)中添加 NSLocationWhenInUseUsageDescription 以访问设备的位置。只需打开您的 Info.plist 文件并添加以下内容

<key>NSLocationWhenInUseUsageDescription</key>
<string>Permission to get your location</string>

用法

导入包

import 'package:address_search_field/address_search_field.dart';

GeoMethods

GeoMethods(
  googleApiKey: String,
  language: String,
  countryCode: String,
  country: String,
  city: String,
  mode: String,
);
  • 此对象使用设置的参数调用 Google API。它可以请求 Google Places、地理编码和路线 API。
  • 语言支持列表 在此
  • 国家列表 在此

AddressSearchBuilder

此小部件是一个构建器,它提供了参数和方法来创建一个可以搜索地址并允许使用 Address 对象处理它们的界面。示例

GeoMethods geoMethods;
TextEditingController controller;

AddressSearchBuilder(
  geoMethods: geoMethods,
  controller: controller,
  builder: (
    BuildContext context,
    AsyncSnapshot<List<Address>> snapshot, {
    TextEditingController controller,
    Future<void> Function() searchAddress,
    Future<Address> Function(Address address) getGeometry,
  }) {
    return AddressSearchDialog(
      snapshot: snapshot,
      controller: controller,
      searchAddress: searchAddress,
      getGeometry: getGeometry,
      onDone: (Address address) => null,
    );
  },
);

AddressSearchDialog 不应单独使用。它需要 AddressSearchBuilder 的参数。使用此小部件的最佳方式是使用 AddressSearchBuilder.deft,它将仅使用 AddressDialogBuilder,并且实现更简单。示例

GeoMethods geoMethods;
TextEditingController controller;

AddressSearchBuilder.deft(
  geoMethods: geoMethods,
  controller: controller,
  builder: AddressDialogBuilder(),
  onDone: (Address address) => null,
);

AddressDialogBuilder

此构建器使用参数来自定义 AddressSearchDialog,后者由 AddressSearchBuilder 调用。示例

AddressDialogBuilder(
  color: Color,
  backgroundColor: Color,
  hintText: String,
  noResultText: String,
  cancelText: String,
  continueText: String,
  useButtons: bool,
);

AddressLocator

此小部件是一种简单的方法,可以在 TextEditingController 中设置初始地址引用,前提是 AddressSearchBuilder 不是由 RouteSearchBox 创建的。locator 参数提供了一个 relocate 函数来执行此操作并获取 Address。示例

GeoMethods geoMethods;
TextEditingController controller;
Coords initialCoords;
Address initialAddress;

AddressLocator(
  geoMethods: geoMethods,
  controller: controller,
  locator: (relocate) async => controller.text.isEmpty
      ? initialAddress.update(await relocate(initialCoords))
      : null,
  child: TextField(
    onTap: () => AddressSearchBuilder.deft(
      geoMethods: geoMethods,
      controller: controller,
      builder: AddressDialogBuilder(),
      onDone: (Address address) {},
    ),
  ),
);

RouteSearchBox

这是一个特殊的小部件,带有一个构建器,它提供了三个 AddressSearchBuilder 来搜索起点 Address、终点 Address 以及可选的途经点 List<Address>。此小部件用于获取由构建器的 AddressSearchBuilder 获取的点的路线。
如何使用此小部件的完整示例可以在 此处 找到。示例

GeoMethods geoMethods;
TextEditingController originCtrl;
TextEditingController destCtrl;
Coords initialCoords;

RouteSearchBox(
  geoMethods: geoMethods,
  originCtrl: originCtrl,
  destinationCtrl: destCtrl,
  builder: (
    BuildContext context,
    AddressSearchBuilder originBuilder,
    AddressSearchBuilder destinationBuilder, {
    Future<Directions> Function() getDirections,
    void Function(AddressId addrId, Coords coords) relocate,
    AddressSearchBuilder waypointBuilder,
    WaypointsManager waypointsMgr,
  }) {
    if(controller.text.isEmpty) relocate(AddressId.origin, initialCoords);
    return Column(
      children: [
        TextField(
          controller: originCtrl,
          onTap: () => showDialog(
            context: context,
            builder:
                (context) => 
                    originBuilder.buildDefault(
              builder: AddressDialogBuilder(),
              onDone: (Address address) => null,
            ),
          ),
        ),
        TextField(
          controller: destCtrl,
          onTap: () => showDialog(
            context: context,
            builder:
                (context) => 
                    destinationBuilder.buildDefault(
              builder: AddressDialogBuilder(),
              onDone: (Address address) => null,
            ),
          ),
        ),
      ],
    );
  },
);

GitHub

https://github.com/JosLuna98/address_search_field