Flutter地图搜索选点带价格时间距离路线插件flutter_map_search_pick_price_time_distance_route_sherifammar的使用

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

Flutter地图搜索选点带价格时间距离路线插件flutter_map_search_pick_price_time_distance_route_sherifammar的使用

这是一个用于在Flutter应用中实现地图搜索、选点、路径规划、距离测量、价格计算和时间估计的插件。它基于Open Street Map,可以免费且易于使用。

特性

  • 按地点搜索位置
  • 轻松使用
  • 在两个点之间创建路径
  • 测量两点之间的距离(米)
  • 更改位置
  • 在地图上测量两个点之间的行程价格
  • 在地图上测量两个点之间的行程时间

示例演示

alt text alt text alt text

开始使用

要开始使用此插件,请首先导入必要的包:

import 'flutter_map_search_pick_price_time_distance_route_sherifammar/flutter_map_search_pick_price_time_distance_route_sherifammar.dart';

使用方法

使用该插件需要以下参数:

  • latidedCurrent: 当前位置的纬度(必需)
  • orsApiKey: 从openrouteservice网站获取的API密钥(必需)
  • longtideCurrent: 当前位置的经度(必需)
  • pricepermeter: 每米的价格(可选,默认值为5)
  • timepermeter: 每米所需的时间(可选,默认值为10)

以下是一个简单的示例代码:

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

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: FlutterMapSearchPickPriceRoute(
        latidedCurrent: 29,
        orsApiKey: 'your token from openrouteservice web site',
        longtideCurrent: 92,
        pricepermeter: 5, // 您每米的价格
        timepermeter: 10, // 每米所需的时间
      ),
    );
  }
}

更多关于Flutter地图搜索选点带价格时间距离路线插件flutter_map_search_pick_price_time_distance_route_sherifammar的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter地图搜索选点带价格时间距离路线插件flutter_map_search_pick_price_time_distance_route_sherifammar的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中集成和使用flutter_map_search_pick_price_time_distance_route_sherifammar(假设这是一个假想的插件名称,因为实际的Flutter生态系统中可能没有这样具体命名的插件,但我会基于需求描述其功能)的示例代码。

首先,你需要确保在pubspec.yaml文件中添加了这个插件的依赖(注意:实际插件名可能会有所不同,这里使用假想的名称):

dependencies:
  flutter:
    sdk: flutter
  flutter_map: ^0.14.0  # Flutter Map 插件,用于显示地图
  geolocator: ^8.0.0    # 用于获取用户位置
  provider: ^6.0.0      # 状态管理
  # 假设的插件名称,实际使用时请替换为真实插件名
  flutter_map_search_pick_price_time_distance_route_sherifammar: ^1.0.0

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

接下来,在你的Flutter应用中,你可以按照以下方式使用这个插件:

import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:geolocator/geolocator.dart';
import 'package:provider/provider.dart';
import 'package:flutter_map_search_pick_price_time_distance_route_sherifammar/flutter_map_search_pick_price_time_distance_route_sherifammar.dart'; // 假设的导入路径

void main() {
  runApp(
    MultiProvider(
      providers: [
        // 你可以在这里添加其他Provider,比如用于管理地图状态的Provider
      ],
      child: MyApp(),
    ),
  );
}

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

class MapScreen extends StatefulWidget {
  @override
  _MapScreenState createState() => _MapScreenState();
}

class _MapScreenState extends State<MapScreen> {
  MapController? _mapController;
  LatLng? _initialPosition;
  List<Marker> _markers = [];
  RouteResult? _routeResult;

  @override
  void initState() {
    super.initState();
    _getCurrentLocation();
  }

  Future<void> _getCurrentLocation() async {
    bool serviceEnabled;
    LocationPermission permission;

    serviceEnabled = await Geolocator.isLocationServiceEnabled();
    if (!serviceEnabled) {
      return Future.error('Location services are disabled.');
    }

    permission = await Geolocator.checkPermission();
    if (permission == LocationPermission.denied) {
      permission = await Geolocator.requestPermission();
      if (permission == LocationPermission.denied) {
        return Future.error('Location permissions are denied');
      }
    }

    if (permission == LocationPermission.deniedForever) {
      return Future.error(
          'Location permissions are permanently denied, we cannot request permissions.');
    }

    Position position = await Geolocator.getCurrentPosition(
        desiredAccuracy: LocationAccuracy.high);
    setState(() {
      _initialPosition = LatLng(position.latitude, position.longitude);
      _markers.add(Marker(
        width: 80.0,
        height: 80.0,
        point: _initialPosition!,
        builder: (ctx) => Container(
          child: Icon(Icons.location_on, size: 40,),
        ),
      ));
      _mapController = MapController()..zoomTo(_initialPosition!.scale(15));
    });
  }

  void _onSearchAndPick(LatLng position) async {
    // 假设插件提供了这个方法来进行搜索和选择点,并返回价格、时间、距离和路线信息
    RouteResult result = await FlutterMapSearchPickPriceTimeDistanceRouteSherifammar.searchAndPick(
      position: position,
      // 其他可能的参数,比如出发地、交通方式等
    );
    setState(() {
      _routeResult = result;
      // 更新标记、路线等UI元素
      _markers.add(Marker(
        width: 80.0,
        height: 80.0,
        point: position,
        builder: (ctx) => Container(
          child: Icon(Icons.pin_drop, size: 40,),
        ),
      ));
      // 假设插件提供了方法来在地图上绘制路线
      // FlutterMapSearchPickPriceTimeDistanceRouteSherifammar.drawRoute(result.route);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Map Search and Pick'),
      ),
      body: FlutterMap(
        mapController: _mapController,
        options: MapOptions(
          center: _initialPosition ?? LatLng(0, 0),
          zoom: 2.0,
        ),
        layers: [
          TileLayerOptions(
            urlTemplate: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
            subdomains: ['a', 'b', 'c'],
          ),
          MarkerLayerOptions(markers: _markers),
          // 假设插件提供了路线图层
          // RouteLayerOptions(routes: [_routeResult?.route]),
        ],
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          // 打开搜索界面或调用插件的搜索功能
          LatLng? pickedPosition = await showSearchLocationDialog(context); // 假设这是一个自定义的对话框函数
          if (pickedPosition != null) {
            _onSearchAndPick(pickedPosition);
          }
        },
        tooltip: 'Search and Pick',
        child: Icon(Icons.search),
      ),
    );
  }
}

// 假设的显示搜索位置对话框函数
Future<LatLng?> showSearchLocationDialog(BuildContext context) async {
  // 这里应该实现一个对话框,让用户搜索和选择一个位置
  // 返回选中的LatLng位置
  // 这个实现依赖于你的具体需求,可能使用第三方库或者自定义实现
  return null; // 示例返回null,实际应返回选中的位置
}

// 假设的RouteResult类,实际使用时根据插件提供的API文档进行修改
class RouteResult {
  String price;
  String time;
  double distance;
  List<LatLng> route;

  RouteResult({required this.price, required this.time, required this.distance, required this.route});
}

注意

  1. 上述代码示例中包含了一些假设的函数和类,比如showSearchLocationDialogRouteResult,这些在实际使用时需要根据插件提供的API文档进行修改。
  2. flutter_map_search_pick_price_time_distance_route_sherifammar是一个假想的插件名称,实际使用时请替换为真实插件的名称。
  3. 插件的具体使用方法和API可能会有所不同,请参考插件的官方文档进行集成和使用。
  4. 在实际项目中,你可能还需要处理错误、优化性能、改善用户体验等。
回到顶部