Flutter地图瓦片加载控制插件flutter_map_cancellable_tile_provider的使用

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

Flutter地图瓦片加载控制插件flutter_map_cancellable_tile_provider的使用

插件简介

flutter_map_cancellable_tile_provider 是为 flutter_map 提供的一个 TileProvider 插件,它能够从网络中获取地图瓦片,并且具有取消不必要的HTTP请求的能力。通过这个特性可以实现:

  • 缩短瓦片加载时间(特别是在Web端)
  • 减少用户(蜂窝)数据和缓存空间的消耗
  • 减少向瓦片服务器发出昂贵的请求*
  • 通过减少CPU和IO工作来提高性能

该提供程序使用了 dio 包,支持在HTTP请求已经发送后取消不必要的请求。

虽然所有平台都支持HTTP请求取消,但在Web端特别有用,因此推荐用于Web应用程序。这是因为Web平台对同时进行的HTTP请求数量有限制,关闭这些请求可以让新的请求为新瓦片腾出位置。在其他平台上,尽管也能获得上述好处,但可能不会像在Web上那样明显。

一旦Dart的’native’ 'http’包添加了HTTP请求取消功能(目前已经有一个PR打开),NetworkTileProvider将被更新以利用这一功能,替换并废弃此提供商。由于依赖额外的Dio依赖项,当前这个瓦片提供程序是一个单独的包,默认情况下并未集成。

示例代码

下面是一个简单的Flutter项目示例,展示了如何使用flutter_map_cancellable_tile_provider插件。

步骤1: 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  flutter_map: ^0.13.1
  flutter_map_cancellable_tile_provider: ^1.0.0

然后运行flutter pub get命令来安装这些依赖。

步骤2: 创建地图视图

接下来创建一个简单的Flutter应用程序,并在其中使用带有可取消瓦片加载器的地图视图。

import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:flutter_map_cancellable_tile_provider/flutter_map_cancellable_tile_provider.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: MyHomePage(title: 'Flutter Map Demo'),
    );
  }
}

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

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: FlutterMap(
        options: MapOptions(
          center: LatLng(51.509363, -0.124718), // London coordinates as an example
          zoom: 13.0,
        ),
        layers: [
          TileLayerOptions(
            urlTemplate: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
            subdomains: ['a', 'b', 'c'],
            tileProvider: CancellableNetworkTileProvider(), // Use the cancellable provider here
          ),
        ],
      ),
    );
  }
}

步骤3: 运行应用

完成以上步骤后,你可以尝试运行你的Flutter应用程序。你应该会看到一个带有OpenStreetMap瓦片的地图,当您快速拖动或缩放地图时,应该能观察到较少的未完成请求,从而提高了整体性能。

请注意,为了确保最佳体验,请根据自己的需求调整地图中心点和其他配置选项。此外,如果需要自定义更多设置,如HTTP头信息等,可以参考dio文档来了解如何进一步定制化请求。


更多关于Flutter地图瓦片加载控制插件flutter_map_cancellable_tile_provider的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter地图瓦片加载控制插件flutter_map_cancellable_tile_provider的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,关于flutter_map_cancellable_tile_provider插件的使用,下面是一个详细的代码案例,展示如何在Flutter项目中集成和使用这个插件来加载和控制地图瓦片。

首先,确保你已经在pubspec.yaml文件中添加了flutter_mapflutter_map_cancellable_tile_provider依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_map: ^x.y.z  # 请使用最新版本
  flutter_map_cancellable_tile_provider: ^a.b.c  # 请使用最新版本

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

接下来是示例代码,展示如何在Flutter应用中使用flutter_map_cancellable_tile_provider来加载地图瓦片:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Map Cancellable Tile Provider Example'),
        ),
        body: MapScreen(),
      ),
    );
  }
}

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

class _MapScreenState extends State<MapScreen> {
  // 自定义的TileProvider
  CancellableTileProvider? _tileProvider;

  @override
  void initState() {
    super.initState();
    // 初始化CancellableTileProvider
    _tileProvider = CancellableTileProvider(
      urlTemplate: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
      subdomains: ['a', 'b', 'c'],
    );
  }

  @override
  void dispose() {
    // 释放资源,取消加载中的瓦片
    _tileProvider?.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return FlutterMap(
      options: MapOptions(
        center: LatLng(51.505, -0.09),
        zoom: 13.0,
      ),
      layers: [
        TileLayerOptions(
          tileProvider: _tileProvider!,
        ),
      ],
    );
  }
}

在这个示例中,我们做了以下几步:

  1. 添加依赖:在pubspec.yaml文件中添加了flutter_mapflutter_map_cancellable_tile_provider的依赖。

  2. 创建应用:创建了一个简单的Flutter应用,包含一个MaterialApp和一个Scaffold,其中包含一个地图屏幕MapScreen

  3. 初始化TileProvider:在MapScreeninitState方法中,我们初始化了CancellableTileProvider,并设置了瓦片的URL模板和子域名。

  4. 释放资源:在dispose方法中,我们调用了_tileProvider?.dispose()来释放资源,确保在组件销毁时取消加载中的瓦片。

  5. 显示地图:在build方法中,我们使用FlutterMap组件来显示地图,并通过TileLayerOptions将自定义的CancellableTileProvider传递给地图图层。

这个示例展示了如何在Flutter应用中使用flutter_map_cancellable_tile_provider来加载和控制地图瓦片。你可以根据实际需求进一步定制和扩展这个示例。

回到顶部