Flutter地图密度显示插件dencity_map_plugin的使用

Flutter地图密度显示插件dencity_map_plugin的使用

dencity_map_plugin 是一个用于在 Dencitylite Android 应用程序中展示地图的原生插件。

Pub Dev

开始使用

这是一个用于 Dencitylite Android 应用程序的插件。此插件用于在 Dencitylite Android 应用程序中展示地图。

前置条件

在你的项目级别 android/app/src/main/res/strings.xml 文件中添加以下依赖项:

<string name="google_maps_key">GOOGLE_MAPS_API_KEY</string>

主要代码

package com.dencity.dencity_map_plugin_example

import com.dencity.dencity_map_plugin.NativeViewFactory
import com.dencity.dencity_map_plugin.SearchScreenViewFactory
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel

class MainActivity : FlutterActivity() {
    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)

        flutterEngine
            .platformViewsController
            .registry
            .registerViewFactory(
                "com.dencity.dencity_map_plugin/map_view",
                NativeViewFactory(this)
            )
        flutterEngine
            .platformViewsController
            .registry
            .registerViewFactory(
                "com.dencity.dencity_map_plugin/search_screen_view",
                SearchScreenViewFactory(this)
            )

        val CHANNEL = "com.dencity.dencity_map_plugin/search_screen_distance"
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL)
            .setMethodCallHandler { call: MethodCall, result: MethodChannel.Result ->
                if (call.method == "getDistance") {
                    val distance = call.argument<String>("key")
                    if (distance != null) {
                        // 使用距离值
                        println("接收到的距离: $distance")
                        result.success(null)
                    } else {
                        result.error("UNAVAILABLE", "距离不可用", null)
                    }
                } else {
                    result.notImplemented()
                }
            }
    }
}

安装

添加依赖

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

dependencies:
  dencity_map_plugin: <latest_version>

最新的版本为: Pub

最新的包括预发布版本的版本为: Pub

使用

主屏幕视图,包含500米范围内的所有标记
[@override](/user/override)
Widget build(BuildContext context) {
  return MaterialApp(
    home: Scaffold(
      appBar: AppBar(
        title: const Text('插件示例应用'),
      ),
      body: PlatformViewLink(
        viewType: 'com.dencity.dencity_map_plugin/map_view',
        surfaceFactory: (context, controller) {
          return AndroidViewSurface(
            controller: controller as AndroidViewController,
            gestureRecognizers: const <Factory<OneSequenceGestureRecognizer>>{},
            hitTestBehavior: PlatformViewHitTestBehavior.opaque,
          );
        },
        onCreatePlatformView: (params) {
          return PlatformViewsService.initSurfaceAndroidView(
            id: params.id,
            viewType: 'com.dencity.dencity_map_plugin/map_view',
            layoutDirection: TextDirection.ltr,
            creationParams: const <String, dynamic>{},
            creationParamsCodec: const StandardMessageCodec(),
            onFocus: () {
              params.onFocusChanged(true);
            },
          )
            ..addOnPlatformViewCreatedListener(params.onPlatformViewCreated)
            ..create();
        },
      ),
    ),
  );
}
搜索屏幕视图,包含多个多边形线段以及500米范围内的标记,并通过平台通道计算距离
import 'package:flutter/foundation.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:permission_handler/permission_handler.dart';

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

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String distanceCallResponse = "不可用";
  static const distanceCallChannel = const MethodChannel(
      'com.dencity.dencity_map_plugin/search_screen_distance');

  [@override](/user/override)
  void initState() {
    super.initState();
    requestLocationPermission();
    getPlatformVersion();
  }

  Future<void> requestLocationPermission() async {
    PermissionStatus status = await Permission.location.request();

    if (status.isGranted) {
      // 位置权限已授予,可以访问用户的位置。
    } else if (status.isDenied) {
      // 位置权限被拒绝,无法访问用户的位置。
    } else if (status.isPermanentlyDenied) {
      // 位置权限永久拒绝,用户需要在设置中启用它。
    }
  }

  Future<void> getPlatformVersion() async {
    try {
      distanceCallChannel.setMethodCallHandler((call) async {
        switch (call.method) {
          case 'getDistance':
            setState(() {
              distanceCallResponse = call.arguments['key'];
            });
            print('接收到距离调用 ${call.arguments['key']}');
            return Future.value('距离调用已接收');
          default:
            throw MissingPluginException();
        }
      });
    } on PlatformException {
      setState(() {
        distanceCallResponse = '获取距离失败。';
      });
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text(distanceCallResponse),
        ),
        body: PlatformViewLink(
          viewType: 'com.dencity.dencity_map_plugin/map_view',
          surfaceFactory: (context, controller) {
            return AndroidViewSurface(
              controller: controller as AndroidViewController,
              gestureRecognizers: const <Factory<OneSequenceGestureRecognizer>>{},
              hitTestBehavior: PlatformViewHitTestBehavior.opaque,
            );
          },
          onCreatePlatformView: (params) {
            return PlatformViewsService.initSurfaceAndroidView(
              id: params.id,
              viewType: 'com.dencity.dencity_map_plugin/search_screen_view',
              layoutDirection: TextDirection.ltr,
              creationParams: const <String, dynamic>{
                "origin": "48.8566, 2.3522",
                "destination": "48.8606, 2.3376",
                "apiKey": "GOOGLE_MAPS_API_KEY",
                "parkingLotsURL":
                    "API_FOR_PARKING_LOTS",
              },
              creationParamsCodec: const StandardMessageCodec(),
              onFocus: () {
                params.onFocusChanged(true);
              },
            )
              ..addOnPlatformViewCreatedListener(params.onPlatformViewCreated)
              ..create();
          },
        ),
      ),
    );
  }
}

更多关于Flutter地图密度显示插件dencity_map_plugin的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


dencity_map_plugin 是一个 Flutter 插件,用于在地图上显示密度信息。它可以帮助你在地图上以热力图、点密度图等形式展示数据分布情况。以下是如何使用 dencity_map_plugin 的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  dencity_map_plugin: ^版本号

请将 ^版本号 替换为最新的插件版本号。你可以在 pub.dev 上查找最新版本。

2. 导入插件

在你的 Dart 文件中导入插件:

import 'package:dencity_map_plugin/dencity_map_plugin.dart';

3. 创建地图

你可以使用 DencityMap 来创建一个带有密度信息的地图。以下是一个简单的示例:

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Density Map Example'),
        ),
        body: DencityMap(
          initialCameraPosition: CameraPosition(
            target: LatLng(37.7749, -122.4194), // 初始地图中心位置(旧金山)
            zoom: 12.0, // 初始缩放级别
          ),
          densityPoints: [
            DensityPoint(
              latLng: LatLng(37.7749, -122.4194),
              density: 0.8, // 密度值,范围在 0 到 1 之间
            ),
            DensityPoint(
              latLng: LatLng(37.7849, -122.4294),
              density: 0.5,
            ),
            // 添加更多点
          ],
          onMapCreated: (DencityMapController controller) {
            // 地图创建完成后的回调
          },
        ),
      ),
    );
  }
}
回到顶部