Flutter地理位置与地图展示插件latlong_maps的使用

Flutter地理位置与地图展示插件latlong_maps的使用

开始使用

这个项目是一个新的Flutter插件项目。它包含适用于Android和/或iOS平台的特定平台实现代码。

示例代码

以下是使用latlong_maps插件的基本示例代码:

import 'package:flutter/material.dart';
import 'package:latlong_maps_example/samples/add_marker.dart';
import 'package:latlong_maps_example/samples/add_symbol.dart';
import 'package:latlong_maps_example/samples/place_circle.dart';
import 'page.dart';
import 'samples/full_map.dart';
import 'package:location/location.dart';
import 'package:latlong_maps_example/samples/map_picker_example_app.dart';
import 'package:latlong_maps_example/samples/map_with_search_bar.dart';
import 'package:latlong_maps_example/samples/direction_widget.dart';
import 'package:latlong_maps_example/samples/add_line.dart';
import 'package:latlong_maps_example/samples/annotation_order_maps.dart';
import 'package:latlong_maps_example/samples/click_annotations.dart';

final List<ExamplePage> _allPages = [
  const FullMapPage(),
  const AddMarkerPage(),
  const PlaceSymbolPage(),
  const LinePage(),
  const PlaceCirclePage(),
  const MapPickerExample(),
  const MapWithSearchBarPage(),
  const MapDirectionsPage(),
  const AnnotationOrderPage(),
  const ClickAnnotationPage()
];

class MapsDemo extends StatefulWidget {
  const MapsDemo({super.key});

  @override
  State<MapsDemo> createState() => _MapsDemoState();
}

class _MapsDemoState extends State<MapsDemo> {

  void _pushPage(BuildContext context, ExamplePage page) async {
    // 检查位置权限
    if (page.needsLocationPermission) {
      final location = Location();
      final hasPermissions = await location.hasPermission();
      if (hasPermissions != PermissionStatus.granted) {
        await location.requestPermission();
      }
    }
    // 如果组件已卸载,则返回
    if (!mounted) return;

    // 导航到新页面
    Navigator.of(context).push(MaterialPageRoute<void>(
        builder: (_) => Scaffold(
              appBar: AppBar(title: Text(page.title)),
              body: page,
            )));
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Latlong Plugin Demo')),
      body: ListView.builder(
        itemCount: _allPages.length,
        itemBuilder: (_, int index) => index == _allPages.length
            ? const AboutListTile(
                applicationName: "",
              )
            : ListTile(
          leading: _allPages[index].leading,
          title: Text(_allPages[index].title),
          onTap: () => _pushPage(context, _allPages[index]),
        ),
      ),
    );
  }
}

void main() {
  runApp(const MaterialApp(home: MapsDemo()));
}

示例代码解释

  1. 导入必要的库

    import 'package:flutter/material.dart';
    import 'package:latlong_maps_example/samples/add_marker.dart'; // 添加标记
    import 'package:latlong_maps_example/samples/add_symbol.dart'; // 添加符号
    import 'package:latlong_maps_example/samples/place_circle.dart'; // 添加圆圈
    import 'package:location/location.dart'; // 获取位置信息
    
  2. 定义所有页面列表

    final List<ExamplePage> _allPages = [
      const FullMapPage(),
      const AddMarkerPage(),
      const PlaceSymbolPage(),
      const LinePage(),
      const PlaceCirclePage(),
      const MapPickerExample(),
      const MapWithSearchBarPage(),
      const MapDirectionsPage(),
      const AnnotationOrderPage(),
      const ClickAnnotationPage()
    ];
    
  3. 创建一个状态类来管理页面导航

    class _MapsDemoState extends State<MapsDemo> {
      void _pushPage(BuildContext context, ExamplePage page) async {
        // 检查位置权限
        if (page.needsLocationPermission) {
          final location = Location();
          final hasPermissions = await location.hasPermission();
          if (hasPermissions != PermissionStatus.granted) {
            await location.requestPermission();
          }
        }
        // 如果组件已卸载,则返回
        if (!mounted) return;
    
        // 导航到新页面
        Navigator.of(context).push(MaterialPageRoute<void>(
            builder: (_) => Scaffold(
                  appBar: AppBar(title: Text(page.title)),
                  body: page,
                )));
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(title: const Text('Latlong Plugin Demo')),
          body: ListView.builder(
            itemCount: _allPages.length,
            itemBuilder: (_, int index) => index == _allPages.length
                ? const AboutListTile(
                    applicationName: "",
                  )
                : ListTile(
              leading: _allPages[index].leading,
              title: Text(_allPages[index].title),
              onTap: () => _pushPage(context, _allPages[index]),
            ),
          ),
        );
      }
    }
    
  4. 主函数启动应用

    void main() {
      runApp(const MaterialApp(home: MapsDemo()));
    }
    

更多关于Flutter地理位置与地图展示插件latlong_maps的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter地理位置与地图展示插件latlong_maps的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter应用中使用latlong_maps插件来展示地理位置与地图的示例代码。请注意,latlong_maps这个插件名称在Flutter社区中可能不是非常常见,因此我假设这是一个用于展示地理位置和地图的插件,其功能类似于flutter_mapgoogle_maps_flutter。如果实际插件名称或功能有所不同,请根据具体情况调整代码。

首先,确保你已经在pubspec.yaml文件中添加了latlong_maps(或相应插件)的依赖:

dependencies:
  flutter:
    sdk: flutter
  latlong_maps: ^x.y.z  # 替换为实际版本号

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

接下来,编写Flutter代码来展示地图和地理位置。以下是一个简单的示例:

import 'package:flutter/material.dart';
import 'package:latlong_maps/latlong_maps.dart'; // 假设这是插件的导入路径

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

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

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

class _MapScreenState extends State<MapScreen> {
  // 假设插件提供了一个MapController用于控制地图
  // 这里我们创建一个控制器实例(如果插件支持的话)
  // LatLongMapController mapController = LatLongMapController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Map Demo'),
      ),
      body: Center(
        child: LatLongMap(
          // 假设插件接受一个initialCameraPosition参数来设置初始视图
          initialCameraPosition: CameraPosition(
            target: LatLng(37.7749, -122.4194), // 旧金山的坐标
            zoom: 14.0,
          ),
          // 如果插件支持标记(markers),可以这样添加
          markers: <Marker>[
            Marker(
              markerId: MarkerId('san_francisco'),
              position: LatLng(37.7749, -122.4194),
              infoWindow: InfoWindow(title: 'San Francisco', snippet: 'USA'),
            ),
          ],
          // 如果插件有onMapCreated回调,可以用于获取地图控制器
          // onMapCreated: (controller) {
          //   setState(() {
          //     mapController = controller;
          //   });
          // },
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 使用地图控制器进行某些操作,比如移动地图视角等
          // mapController.animateCamera(CameraUpdate.newLatLngZoom(
          //   LatLng(34.0522, -118.2437), // 洛杉矶的坐标
          //   14.0,
          // ));
        },
        tooltip: 'Move to Los Angeles',
        child: Icon(Icons.navigation),
      ),
    );
  }
}

// 假设插件定义了这些类用于地图展示
class LatLongMap extends StatelessWidget {
  final CameraPosition initialCameraPosition;
  final List<Marker> markers;
  // final ValueChanged<LatLongMapController> onMapCreated;

  LatLongMap({
    required this.initialCameraPosition,
    required this.markers,
    // this.onMapCreated,
  });

  @override
  Widget build(BuildContext context) {
    // 这里应该是插件提供的地图组件的实例化代码
    // 但由于我们不知道实际插件的API,这里仅作为示例
    return Container(
      child: // 插件地图组件的实例化,例如 MapWidget(initialCameraPosition: ..., markers: ...)
      Text('Map will be displayed here if latlong_maps plugin is correctly integrated.'),
    );
  }
}

class CameraPosition {
  final LatLng target;
  final double zoom;

  CameraPosition({required this.target, required this.zoom});
}

class LatLng {
  final double latitude;
  final double longitude;

  LatLng(this.latitude, this.longitude);
}

class Marker {
  final MarkerId markerId;
  final LatLng position;
  final InfoWindow infoWindow;

  Marker({required this.markerId, required this.position, required this.infoWindow});
}

class MarkerId {
  final String value;

  MarkerId(this.value);
}

class InfoWindow {
  final String title;
  final String snippet;

  InfoWindow({required this.title, required this.snippet});
}

注意

  1. 上述代码是一个假设性的示例,因为latlong_maps插件可能并不真实存在,或者其API可能与示例中展示的有所不同。
  2. 在实际使用中,你应该参考插件的官方文档和示例代码来了解如何正确集成和使用该插件。
  3. 如果使用的是flutter_mapgoogle_maps_flutter等实际存在的插件,请参考它们的官方文档和示例代码。

希望这个示例能帮助你理解如何在Flutter应用中集成和使用地图插件。如果有任何疑问或需要进一步的帮助,请随时提问。

回到顶部