Flutter地址搜索插件address_search_field的使用

发布于 1周前 作者 itying888 来自 Flutter

Flutter地址搜索插件address_search_field的使用

address_search_field 插件帮助开发者创建能够自动补全地址的搜索小部件。这些小部件可以在用户点击文本输入框时通过 showDialog 函数显示出来。该插件依赖于以下库:

  • Dio
  • Google Maps for Flutter
  • Flutter Riverpod

演示

演示

引入插件

pubspec.yaml 文件中添加依赖项:

dependencies:
  address_search_field: ^5.0.3

Android权限配置

AndroidManifest.xml 文件中添加互联网权限:

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

导入库

在 Dart 文件中导入 address_search_field 包:

import 'package:address_search_field/address_search_field.dart';

使用GeoMethods

GeoMethods 对象用于调用 Google API,并支持多种参数设置。

GeoMethods geoMethods;
TextEditingController controller;
Address destinationAddress;

// 创建一个GeoMethods实例
final geoMethods = GeoMethods(
  googleApiKey: 'YOUR_GOOGLE_API_KEY',
  language: 'en',
  countryCode: 'us',
);

// 调用API
geoMethods.autocompletePlace(query: 'place streets or reference');
geoMethods.geoLocatePlace(coords: Coords(0.10, 0.10));
geoMethods.getPlaceGeometry(reference: 'place streets', placeId: 'ajFDN3662fNsa4hhs42FAjeb5n');
geoMethods.getDirections(origin: Address(coords: Coords(0.10, 0.10)), destination: Address(coords: Coords(0.10, 0.10)));

使用AddressSearchBuilder

AddressSearchBuilder 小部件允许用户搜索地址并处理地址对象。

TextField(
  controller: controller,
  onTap: () => showDialog(
    context,
    builder: (BuildContext context) => AddressSearchDialog(
      geoMethods: geoMethods,
      controller: controller,
      onDone: (Address address) => destinationAddress = address,
    )
  ),
);

自定义AddressSearchDialog

可以通过 AddressSearchDialog.custom 创建自定义对话框。

TextField(
  controller: controller,
  onTap: () => showDialog(
    context,
    builder: (BuildContext context) {
      return AddressSearchDialog.custom(
        geoMethods: geoMethods,
        builder: (
          BuildContext context,
          AsyncSnapshot<List<Address>> snapshot,
          Future<void> Function() searchAddress,
          Future<Address> Function(Address address) getGeometry,
          void Function() dismiss,
        ) {
          return MyCustomWidget(
            snapshot: snapshot,
            searchAddress: searchAddress,
            getGeometry: getGeometry,
            dismiss: dismiss,
            controller: controller,
            address: destinationAddress,
          );
        }
      );
    }
  ),
);

使用AddressLocator

AddressLocator 小部件允许从坐标获取地址引用。

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

AddressLocator(
  coords: coords,
  geoMethods: geoMethods,
  controller: controller,
  child: TextField(
    controller: controller,
    onTap: () => showDialog(
      context: context,
      builder: (BuildContext context) => AddressSearchDialog(
        controller: controller,
        geoMethods: geoMethods,
        onDone: (Address address) => initialAddress = address,
      ),
    ),
  ),
);

使用RouteSearchBox

RouteSearchBox 小部件可以帮助你使用 flutter_riverpod 提供者来管理路线信息。

final routeProvider = ChangeNotifierProvider<RouteNotifier>((ref) => RouteNotifier());

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

RouteSearchBox(
  provider: routeProvider,
  geoMethods: geoMethods,
  originController: originCtrl,
  destinationController: destCtrl,
  locationSetters: [
    LocationSetter(
      coords: initialCoords,
      addressId: AddressId.origin,
    ),
  ],
  child: Column(
    children: [
      TextField(
        controller: originCtrl,
        onTap: () => showDialog(
          context: context,
          builder: (context) => AddressSearchDialog.withProvider(
            provider: routeProvider,
            addressId: AddressId.origin,
          ),
        ),
      ),
      TextField(
        controller: destCtrl,
        onTap: () => showDialog(
          context: context,
          builder: (context) => AddressSearchDialog.withProvider(
            provider: routeProvider,
            addressId: AddressId.destination,
          ),
        ),
      ),
      Consumer(
        builder: (BuildContext context, WidgetRef ref, Widget? _) {
          return ElevatedButton(
            child: const Text('Search'),
            onPressed: () async {
              final route = await ref.read(routeProvider).findRoute();
            },
          );
        },
      ),
    ],
  )
);

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

1 回复

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


当然,以下是如何在Flutter项目中集成和使用address_search_field插件的一个示例。这个插件允许用户在应用中进行地址搜索,通常与Google Maps API结合使用。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  address_search_field: ^x.y.z  # 请替换为最新版本号

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

2. 配置Google Maps API

由于地址搜索通常依赖于Google Maps API,你需要获取一个API密钥,并在你的AndroidManifest.xmlInfo.plist文件中进行配置。

Android

AndroidManifest.xml中添加:

<application>
    <!-- 其他配置 -->
    <meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="YOUR_GOOGLE_MAPS_API_KEY"/>
    <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />
</application>

iOS

Info.plist中添加:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
<key>io.flutter.embedded_views_preview</key>
<true/>
<key>GOOGLE_MAPS_API_KEY</key>
<string>YOUR_GOOGLE_MAPS_API_KEY</string>

3. 使用AddressSearchField

在你的Flutter代码中,你可以这样使用AddressSearchField

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Address Search Field Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final AddressSearchFieldController _controller = AddressSearchFieldController();
  String _selectedAddress = '';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Address Search Field Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            AddressSearchField(
              apiKey: 'YOUR_GOOGLE_MAPS_API_KEY', // 在这里填入你的API密钥
              controller: _controller,
              onSelected: (place) {
                setState(() {
                  _selectedAddress = "${place.name}, ${place.vicinity}";
                });
              },
              hintText: 'Search for an address',
              language: 'en', // 设置搜索语言
            ),
            SizedBox(height: 16),
            Text('Selected Address:', style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
            Text(_selectedAddress, style: TextStyle(fontSize: 16)),
          ],
        ),
      ),
    );
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }
}

4. 运行应用

确保你已经配置好了API密钥,并且网络连接正常,然后运行你的Flutter应用。你应该能够看到一个地址搜索栏,输入地址时会显示搜索结果,选择一个地址后,会在页面上显示选中的地址信息。

请注意,你需要确保你的Google Maps API密钥没有被限制,并且已经启用了Places API。你可以在Google Cloud Console中管理你的API密钥和启用相应的API。

回到顶部