Flutter地图标记缓存插件cached_map_marker的使用

Flutter地图标记缓存插件cached_map_marker的使用

提供了用于简化在Flutter应用程序中缓存Google Maps自定义标记的库。它利用flutter_cache_manager包来缓存图像和小部件,从而实现高效的检索和使用地图上的自定义标记。该软件包通过以下功能解决了管理标记资源时常见的挑战:

  1. 缓存网络图像:从网络下载并缓存图像,并根据需要调整大小以用作地图标记。
  2. 将小部件渲染为图像并缓存:将Flutter小部件渲染为图像,缓存这些图像,并将其用作自定义标记。这对于需要在地图上显示的动态内容特别有用。
  3. 高效资源管理:提供清除缓存的方法,确保应用程序有效地管理资源并避免不必要的存储使用。
pub package License: MIT

特性

  • 下载和缓存:自动下载并缓存图像以用作地图标记,减少网络请求并提高性能。
  • 自定义标记大小:允许指定标记图像的大小,以便根据应用程序的需求进行定制。
  • 缓存管理:提供清除缓存的方法,帮助管理设备的存储,并确保使用最新的图像。
  • 与Google Maps Flutter轻松集成:通过BitmapDescriptor对象与Google Maps Flutter集成。

入门指南

要在Flutter项目中使用Cached Map Marker包,请遵循以下步骤:

安装

  1. 在您的pubspec.yaml文件中添加以下内容:
dependencies:
  cached_map_marker: <lastest>
  1. 导入包
import 'package:cached_map_marker/cached_map_marker.dart';

创建一个来自小部件和网络图像的自定义标记,并将其缓存

final _cachedMapMarker = CachedMapMarker();
final markers = await Future.wait([
      // 创建一个来自网络图像的自定义标记并缓存它
      _cachedMapMarker.fromNetwork(
          url: 'https://cdn-icons-png.flaticon.com/512/5193/5193688.png',
          size: const Size(60, 60)),
      // 创建一个来自小部件的自定义标记并缓存它
  _cachedMapMarker.fromWidget(
        widget: Container(
          decoration: BoxDecoration(
            color: Colors.white,
            borderRadius: BorderRadius.circular(50),
          ),
          child: const Icon(
            Icons.location_on,
            color: Colors.red,
            size: 50,
        ),
      ),
    cacheKey: 'widget_marker',
    logicalSize: const Size(250, 250),
    imageSize: const Size(100, 100),
    )
]);

贡献

欢迎贡献!请随时提交拉取请求。

许可证

此包在MIT许可证下授权。详情请参阅LICENSE文件。


### 示例代码

```dart
import 'package:cached_map_marker/cached_map_marker.dart';
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.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(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const HomePage(),
    );
  }
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Cached Map Marker Demo'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            Navigator.of(context).push(
              MaterialPageRoute(
                builder: (context) => const GoogleMapView(),
              ),
            );
          },
          child: const Text('Go to Google Map View'),
        ),
      ),
    );
  }
}

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

  [@override](/user/override)
  State<GoogleMapView> createState() => _GoogleMapViewState();
}

class _GoogleMapViewState extends State<GoogleMapView> {
  Set<Marker> markers = {};
  late CachedMapMarker _cachedMapMarker;

  [@override](/user/override)
  void initState() {
    _cachedMapMarker = CachedMapMarker();
    _initMarkers();
    super.initState();
  }

  void _initMarkers() async {
    late Marker networkMarker;
    late Marker bytesMarker;
    final futures = await Future.wait([
      _cachedMapMarker.fromNetwork(
          url: 'https://cdn-icons-png.flaticon.com/512/5193/5193688.png',
          size: const Size(60, 60)),
      _cachedMapMarker.fromWidget(
        widget: Container(
          decoration: BoxDecoration(
            color: Colors.white,
            borderRadius: BorderRadius.circular(50),
          ),
          child: const Icon(
            Icons.location_on,
            color: Colors.red,
            size: 50,
          ),
        ),
        cacheKey: 'widget_marker',
        logicalSize: const Size(250, 250),
        imageSize: const Size(100, 100),
      )
    ]);
    networkMarker = Marker(
        markerId: const MarkerId('network_marker_id'),
        position: const LatLng(37.77483, -122.41942),
        icon: futures[0]);

    bytesMarker = Marker(
        markerId: const MarkerId('bytes_marker_id'),
        position: const LatLng(37.734921595128405, -122.43419039994477),
        icon: futures[1]);
    setState(() {
      markers.addAll([networkMarker, bytesMarker]);
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Cached Map Marker Demo'),
      ),
      body: GoogleMap(
        initialCameraPosition: const CameraPosition(
          target: LatLng(37.77483, -122.41942),
          zoom: 12,
        ),
        markers: markers,
      ),
    );
  }
}

更多关于Flutter地图标记缓存插件cached_map_marker的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


cached_map_marker 是一个用于在 Flutter 中缓存地图标记的插件,它可以帮助你更高效地管理和显示地图上的标记。以下是如何使用 cached_map_marker 插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  cached_map_marker: ^0.0.1  # 请检查最新版本

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

2. 导入包

在你的 Dart 文件中导入 cached_map_marker 包:

import 'package:cached_map_marker/cached_map_marker.dart';

3. 使用 CachedMapMarker

cached_map_marker 插件通常与 flutter_map 或其他地图插件一起使用。以下是一个简单的示例,展示如何在 flutter_map 中使用 CachedMapMarker

import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:latlong2/latlong.dart';
import 'package:cached_map_marker/cached_map_marker.dart';

class MapScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Cached Map Marker Example'),
      ),
      body: FlutterMap(
        options: MapOptions(
          center: LatLng(51.509364, -0.128928), // 伦敦的经纬度
          zoom: 13.0,
        ),
        layers: [
          TileLayerOptions(
            urlTemplate: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
            subdomains: ['a', 'b', 'c'],
          ),
          MarkerLayerOptions(
            markers: [
              CachedMapMarker(
                point: LatLng(51.509364, -0.128928), // 标记的位置
                builder: (context) => Icon(
                  Icons.location_on,
                  color: Colors.red,
                  size: 40.0,
                ),
              ),
            ],
          ),
        ],
      ),
    );
  }
}

4. 缓存标记

CachedMapMarker 会自动缓存标记,以便在多次显示时提高性能。你可以在 builder 中定义标记的样式和内容。

5. 自定义标记

你可以通过 builder 参数自定义标记的外观。例如,你可以使用 IconImage 或其他 Flutter 组件来创建标记。

CachedMapMarker(
  point: LatLng(51.509364, -0.128928),
  builder: (context) => Image.asset('assets/marker.png'),
),

6. 处理点击事件

你还可以处理标记的点击事件,例如显示一个信息窗口或执行其他操作。

CachedMapMarker(
  point: LatLng(51.509364, -0.128928),
  builder: (context) => Icon(
    Icons.location_on,
    color: Colors.red,
    size: 40.0,
  ),
  onTap: () {
    print('Marker tapped!');
  },
),

7. 清除缓存

在某些情况下,你可能需要手动清除缓存。你可以使用 CachedMapMarker.clearCache() 方法来清除所有缓存的标记。

CachedMapMarker.clearCache();
回到顶部