Flutter插件dgis_flutter的使用_dgis_flutter是一个由 2GIS 提供的插件,用于在 Flutter 应用中集成地图功能
Flutter插件dgis_flutter的使用_dgis_flutter是一个由 2GIS 提供的插件,用于在 Flutter 应用中集成地图功能
dgis_flutter介绍
dgis_flutter
是一个由 2GIS 提供的插件,用于在 Flutter 应用中集成地图功能。
Flutter插件dgis_flutter开始使用
要运行地图功能,你需要以下两个密钥:
mapKey
:用于 MapGL JS API 和 Android NativeSDK 的密钥。- 其他密钥:例如用于
truck-directions
的密钥。
所有与地图相关的操作都是通过 GisMapController
控制器来完成的。该控制器目前还没有绑定到具体的地图实例,并且可以在任何时候创建。它的主要作用是向原生 SDK 发送消息。
示例代码
import 'dart:developer';
import 'dart:typed_data';
import 'dart:ui';
import 'package:dgis_flutter/dgis_flutter.dart';
import 'package:dgis_flutter_example/assets_constant.dart';
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({Key? key}) : super(key: key);
[@override](/user/override)
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
[@override](/user/override)
void initState() {
super.initState();
}
[@override](/user/override)
Widget build(BuildContext context) {
return const MaterialApp(
home: GisScreen(),
);
}
}
class GisScreen extends StatefulWidget {
const GisScreen({Key? key}) : super(key: key);
[@override](/user/override)
State<GisScreen> createState() => _GisScreenState();
}
class _GisScreenState extends State<GisScreen> {
final GisMapController controller = GisMapController();
late final Future<List<GisMapMarker>> icons;
List<GisMapMarker> list = [];
[@override](/user/override)
void initState() {
icons = Future.wait([getPngFromAsset(context, AssetPath.iconsPointGrey, 60)])
.then((value) => [
GisMapMarker(
icon: value[0],
latitude: 52.29778,
longitude: 104.29639,
zIndex: 0,
id: "123456",
)
]);
super.initState();
}
Future<Uint8List> getPngFromAsset(
BuildContext context,
String path,
int width,
) async {
ByteData data = await DefaultAssetBundle.of(context).load(path);
Codec codec = await instantiateImageCodec(
data.buffer.asUint8List(),
targetWidth: width,
);
FrameInfo fi = await codec.getNextFrame();
return (await fi.image.toByteData(format: ImageByteFormat.png))!.buffer.asUint8List();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
body: SizedBox(
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height,
child: ButtonMapWidget(
controller: controller,
child: FutureBuilder<List<GisMapMarker>>(
future: icons,
builder: (context, snapshot) {
if (!snapshot.hasData) return const SizedBox();
list = snapshot.data!;
return GisMap(
directoryKey: 'rubyqf9316',
mapKey: 'b7272230-6bc3-47e9-b24b-0eba73b12fe1',
useHybridComposition: true,
controller: controller,
onTapMarker: (marker) {
// 忽略:打印标记ID
print(marker.id);
},
startCameraPosition: const GisCameraPosition(
latitude: 52.29778,
longitude: 104.29639,
bearing: 85.0,
tilt: 25.0,
zoom: 14.0,
),
);
},
),
),
),
);
}
}
class ButtonMapWidget extends StatelessWidget {
final Widget child;
final GisMapController controller;
const ButtonMapWidget({Key? key, required this.child, required this.controller}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return Stack(
children: [
child,
Align(
alignment: Alignment.bottomCenter,
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
FloatingActionButton(
child: const Icon(Icons.gps_fixed),
onPressed: () async {
final status = await controller.setCameraPosition(latitude: 55.752425, longitude: 37.613983);
log(status);
},
),
FloatingActionButton(
child: const Icon(Icons.zoom_in_outlined),
onPressed: () async {
final status = await controller.increaseZoom(duration: 200);
log(status);
},
),
FloatingActionButton(
child: const Icon(Icons.zoom_out_outlined),
onPressed: () async {
final status = await controller.reduceZoom(duration: 200);
log(status);
},
),
FloatingActionButton(
child: const Icon(Icons.add),
onPressed: () async {
final status = await controller.setRoute(RoutePosition(
finishLatitude: 55.752425,
finishLongitude: 37.613983,
startLatitude: 55.759909,
startLongitude: 37.618806));
log(status);
},
),
FloatingActionButton(
child: const Icon(Icons.remove),
onPressed: () async {
final status = await controller.removeRoute();
log(status);
},
),
],
),
),
],
);
}
}
更多关于Flutter插件dgis_flutter的使用_dgis_flutter是一个由 2GIS 提供的插件,用于在 Flutter 应用中集成地图功能的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter插件dgis_flutter的使用_dgis_flutter是一个由 2GIS 提供的插件,用于在 Flutter 应用中集成地图功能的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
dgis_flutter
是一个用于在 Flutter 应用中集成 DGIS 地图服务的插件。DGIS(2GIS)是一个广受欢迎的地图服务,主要在东欧和中亚地区使用,提供了丰富的地图数据、导航、地点搜索等功能。
如果你正在探索如何使用 dgis_flutter
插件,以下是一些基本步骤和指南,帮助你开始:
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 dgis_flutter
插件的依赖。
dependencies:
flutter:
sdk: flutter
dgis_flutter: ^latest_version
然后运行 flutter pub get
来获取依赖。
2. 配置 API 密钥
在使用 DGIS 地图服务之前,你需要在 DGIS 开发者平台上注册并获取 API 密钥。将 API 密钥配置到你的应用中。
import 'package:dgis_flutter/dgis_flutter.dart';
void main() {
DGis.initialize('YOUR_API_KEY');
runApp(MyApp());
}
3. 显示地图
在 Flutter 应用中显示 DGIS 地图非常简单。你可以使用 DGisMap
小部件来嵌入地图。
import 'package:flutter/material.dart';
import 'package:dgis_flutter/dgis_flutter.dart';
class MapScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('DGIS Map'),
),
body: DGisMap(
initialPosition: LatLng(55.7558, 37.6176), // 初始地图中心坐标
initialZoom: 12, // 初始缩放级别
),
);
}
}
4. 添加标记
你可以在地图上添加标记来显示特定的位置。
DGisMap(
initialPosition: LatLng(55.7558, 37.6176),
initialZoom: 12,
markers: [
Marker(
position: LatLng(55.7558, 37.6176),
icon: 'assets/marker.png', // 自定义标记图标
),
],
),
5. 处理地图事件
你可以监听地图的各种事件,例如用户点击地图、地图移动等。
DGisMap(
initialPosition: LatLng(55.7558, 37.6176),
initialZoom: 12,
onMapClick: (LatLng position) {
print('Map clicked at $position');
},
onCameraMove: (CameraPosition position) {
print('Camera moved to $position');
},
),
6. 地点搜索
dgis_flutter
插件还提供了地点搜索功能,你可以根据关键字搜索地点并在地图上显示结果。
Future<void> searchPlaces(String query) async {
final results = await DGis.searchPlaces(query);
results.forEach((place) {
print('Place: ${place.name}, Location: ${place.position}');
});
}
7. 导航功能
你还可以使用 DGIS 的导航功能来计算路线并显示在地图上。
Future<void> calculateRoute(LatLng origin, LatLng destination) async {
final route = await DGis.calculateRoute(origin, destination);
print('Route distance: ${route.distance}, duration: ${route.duration}');
}
8. 自定义地图样式
你可以通过设置自定义的样式来改变地图的外观。
DGisMap(
initialPosition: LatLng(55.7558, 37.6176),
initialZoom: 12,
mapStyle: MapStyle.dark, // 使用深色地图样式
),
9. 处理权限
在 Android 和 iOS 上,你可能需要处理地图相关的权限,例如位置权限。
import 'package:permission_handler/permission_handler.dart';
Future<void> requestLocationPermission() async {
final status = await Permission.location.request();
if (status.isGranted) {
print('Location permission granted');
} else {
print('Location permission denied');
}
}