Flutter地图搜索插件mapbox_search_widget的使用

关于

这个插件提供了与 mapbox_search 库一起使用的部件。它还包含一个静态地图图像生成器 😆。

安装

在你的 pubspec.yaml 文件中添加以下依赖项:

dependencies:
  mapbox_search_widget: any

示例

以下是使用 MapBoxPlaceSearchWidget 的示例代码:

MapBoxPlaceSearchWidget(
  popOnSelect: true, // 点击选择后是否关闭弹窗
  apiKey: "API KEY", // 替换为你的 Mapbox API 密钥
  limit: 10, // 搜索结果的最大数量
  searchHint: 'Your Hint here', // 搜索框的提示文字
  onSelected: (place) { // 当用户选择一个地点时触发的回调函数
    print(place.placeName); // 打印选中的地点名称
  },
  context: context, // 当前上下文
)

截图

搜索小部件

搜索小部件 搜索小部件

完整示例代码

以下是完整的示例代码,展示如何在 Flutter 中使用 mapbox_search_widget 插件。

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

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

const kApiKey = 'YOUR_API_KEY'; // 替换为你的 Mapbox API 密钥

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    assert(kApiKey != 'YOUR_API_KEY',
        "You must provide an API Key in order to run this example.");

    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MapBoxExample(),
    );
  }
}

class MapBoxExample extends StatefulWidget {
  [@override](/user/override)
  _MapBoxExampleState createState() => _MapBoxExampleState();
}

class _MapBoxExampleState extends State<MapBoxExample> {
  MapBoxStaticImage staticImage = MapBoxStaticImage(apiKey: kApiKey);

  Future<List<MapBoxPlace>> getPlaces() async {
    ReverseGeoCoding reverseGeoCoding = ReverseGeoCoding(
      apiKey: kApiKey,
      limit: 5,
    );
    return await reverseGeoCoding.getAddress(Location(
        lat: 48.8584, // 这是埃菲尔铁塔的位置
        lng: 2.2945));
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('MapBox Api Example'),
      ),
      floatingActionButton: FloatingActionButton.extended(
        label: Text('Search'),
        icon: Icon(Icons.search),
        onPressed: () {
          Navigator.push(
            context,
            MaterialPageRoute(
              builder: (context) => SearchPage(),
            ),
          );
        },
      ),
      body: Column(
        crossAxisAlignment: CrossAxisAlignment.center,
        mainAxisSize: MainAxisSize.max,
        children: [
          Text(
            'Static Image with Marker',
            style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
          ),
          Expanded(
            child: Image.network(
              getStaticImageWithMarker(),
              fit: BoxFit.cover,
            ),
          ),
          InkWell(
            onTap: () async {
              var places = await getPlaces();
              print(places.length);
            },
            child: Text(
              'Static Image with polyline',
              style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
            ),
          ),
          Expanded(
            child: Image.network(
              getStaticImageWithPolyline(),
              fit: BoxFit.cover,
            ),
          ),
          Text(
            'Static Image without Marker',
            style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
          ),
          Expanded(
            child: Image.network(
              getStaticImageWithoutMarker(),
              fit: BoxFit.cover,
            ),
          ),
        ],
      ),
    );
  }

  String getStaticImageWithPolyline() => staticImage.getStaticUrlWithPolyline(
        point1: Location(lat: 37.77343, lng: -122.46589),
        point2: Location(lat: 37.75965, lng: -122.42816),
        marker1: MapBoxMarker(
            markerColor: Color.rgb(0, 0, 0),
            markerLetter: 'p',
            markerSize: MarkerSize.LARGE),
        msrker2: MapBoxMarker(
            markerColor: Color.rgb(244, 67, 54),
            markerLetter: 'q',
            markerSize: MarkerSize.SMALL),
        height: 300,
        width: 600,
        zoomLevel: 16,
        style: MapBoxStyle.Dark,
        path: MapBoxPath(
          pathColor: Color.rgb(244, 0, 0),
          pathOpacity: 0.5,
          pathWidth: 5,
          pathPolyline:
              "%7DrpeFxbnjVsFwdAvr@cHgFor@jEmAlFmEMwM_FuItCkOi@wc@bg@wBSgM",
        ),
        render2x: true,
      );

  String getStaticImageWithMarker() => staticImage.getStaticUrlWithMarker(
        center: Location(lat: 37.77343, lng: -122.46589),
        marker: MapBoxMarker(
            markerColor: Color.rgb(0, 0, 0),
            markerLetter: 'p',
            markerSize: MarkerSize.LARGE),
        height: 300,
        width: 600,
        zoomLevel: 16,
        style: MapBoxStyle.Streets,
        render2x: true,
      );

  String getStaticImageWithoutMarker() => staticImage.getStaticUrlWithoutMarker(
        center: Location(lat: 37.75965, lng: -122.42816),
        height: 300,
        width: 600,
        zoomLevel: 16,
        style: MapBoxStyle.Outdoors,
        render2x: true,
      );
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.arrow_back_ios),
        onPressed: () {
          Navigator.pop(context);
        },
      ),
      body: SafeArea(
        bottom: false,
        child: MapBoxPlaceSearchWidget(
          popOnSelect: true,
          apiKey: kApiKey,
          searchHint: 'Search around',
          onSelected: (place) {
            print(place.placeName); // 打印选中的地点名称
          },
          context: context,
        ),
      ),
    );
  }
}
1 回复

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


mapbox_search_widget 是一个用于在 Flutter 应用中集成 Mapbox 搜索功能的插件。它允许用户在应用中搜索地点、地址、POI(兴趣点)等,并将搜索结果展示在地图上。以下是如何在 Flutter 项目中使用 mapbox_search_widget 的基本步骤。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  mapbox_search_widget: ^1.0.0  # 请检查最新版本

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

2. 获取 Mapbox Access Token

要使用 Mapbox 服务,你需要一个 Mapbox Access Token。你可以在 Mapbox 官网 注册并获取 Access Token。

3. 使用 MapboxSearchWidget

在你的 Flutter 应用中使用 MapboxSearchWidget 来集成搜索功能。以下是一个简单的示例:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Mapbox Search Example'),
        ),
        body: MapboxSearchExample(),
      ),
    );
  }
}

class MapboxSearchExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Expanded(
          child: MapboxSearchWidget(
            accessToken: 'YOUR_MAPBOX_ACCESS_TOKEN',  // 替换为你的 Mapbox Access Token
            onSelected: (MapboxPlace place) {
              // 当用户选择一个地点时触发
              print('Selected Place: ${place.placeName}');
              print('Coordinates: ${place.geometry.coordinates}');
            },
            onError: (String error) {
              // 当搜索出错时触发
              print('Error: $error');
            },
          ),
        ),
      ],
    );
  }
}

4. 处理搜索结果

onSelected 回调中,你可以处理用户选择的地点。MapboxPlace 对象包含了地点的名称、坐标等信息。

5. 自定义搜索框

你可以通过 searchHint 参数来自定义搜索框的提示文本:

MapboxSearchWidget(
  accessToken: 'YOUR_MAPBOX_ACCESS_TOKEN',
  searchHint: 'Search for a place...',
  onSelected: (MapboxPlace place) {
    print('Selected Place: ${place.placeName}');
  },
  onError: (String error) {
    print('Error: $error');
  },
)

6. 设置搜索范围

你可以通过 proximity 参数来设置搜索的中心点,以便优先显示该区域内的结果:

MapboxSearchWidget(
  accessToken: 'YOUR_MAPBOX_ACCESS_TOKEN',
  proximity: Location(lat: 37.7749, lng: -122.4194),  // 旧金山的坐标
  onSelected: (MapboxPlace place) {
    print('Selected Place: ${place.placeName}');
  },
  onError: (String error) {
    print('Error: $error');
  },
)
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!