Flutter导航HUD框架插件gmaps_nav_hud_frame的使用
Flutter导航HUD框架插件gmaps_nav_hud_frame的使用
Google Maps Turn-by-Turn Directions
显示Google Maps逐向导航通知在Frame上(仅限Android,因为需要读取应用通知)
当一个Google Maps导航会话正在进行时,在Android设备上会运行一个持续的通知,显示一些文本(例如下一个转弯的距离、下一条街道的名称等)以及一个方向箭头图标。
通过使用flutter_notification_listener插件,每次通知发生变化时都会从通知中获取这些信息,并将其推送到Frame显示。
推荐仅在步行时使用逐向导航的抬头显示功能。
已知问题包括每次都需要请求通知权限(偶尔权限可能不会出现在批准/未批准列表中——可以尝试卸载并重新安装作为解决方法)。后台模式或屏幕关闭尚未测试。显示仅在应用程序点击“停止”时清除,而不是在浮动操作按钮取消时清除。
指令
- 点击唤醒Frame,然后在应用程序中点击“连接”以连接到Frame,再点击“启动”以将应用程序加载到Frame上。
- 接着点击导航的浮动操作按钮,接受通知权限以开始。
- 应用程序会监听主机设备上正在运行的现有或任何新的Google Maps实时导航会话的通知,并将导航方向镜像到Frame显示。
- 对于现有的实时导航会话,通知大约每分钟更新一次,因此你可能需要等待一分钟才能看到第一次更新。
- 对于新的导航会话,通知应该立即更新。
- 导航结束后,点击“停止”和“断开连接”,以从Frame中移除应用程序文件,并与主机设备进行干净的蓝牙断开连接。
完整示例代码
以下是一个完整的示例代码,展示如何使用gmaps_nav_hud_frame
插件实现导航HUD功能:
import 'package:flutter/material.dart';
import 'package:flutter_notification_listener/flutter_notification_listener.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: NavigationHUDScreen(),
);
}
}
class NavigationHUDScreen extends StatefulWidget {
@override
_NavigationHUDScreenState createState() => _NavigationHUDScreenState();
}
class _NavigationHUDScreenState extends State<NavigationHUDScreen> {
String _notificationText = "等待导航开始...";
// 监听通知变化
void _onNotificationReceived(NotificationEvent event) {
setState(() {
_notificationText = event.notificationTitle; // 获取通知标题
});
}
@override
void initState() {
super.initState();
// 初始化通知监听器
NotificationListenerService.startListening(_onNotificationReceived);
}
@override
void dispose() {
// 停止监听器
NotificationListenerService.stopListening();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("导航HUD"),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
"当前导航提示:",
style: TextStyle(fontSize: 18),
),
SizedBox(height: 10),
Text(
_notificationText,
style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
),
],
),
),
);
}
}
说明
-
依赖项:
- 使用了
flutter_notification_listener
插件来监听系统通知。 - 需要在
pubspec.yaml
中添加依赖项:dependencies: flutter_notification_listener: ^0.2.0
- 使用了
-
关键逻辑:
NotificationListenerService.startListening()
开始监听通知事件。NotificationListenerService.stopListening()
停止监听通知事件。- 通过回调函数
_onNotificationReceived
更新UI显示。
-
权限申请:
- 在AndroidManifest.xml中添加权限:
<uses-permission android:name="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE" />
- 在AndroidManifest.xml中添加权限:
更多关于Flutter导航HUD框架插件gmaps_nav_hud_frame的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
gmaps_nav_hud_frame
是一个用于 Flutter 的插件,它提供了一个导航 HUD(Head-Up Display)框架,通常用于在 Google 地图上显示导航信息。这个插件可以帮助开发者在应用中集成类似于汽车导航系统的 HUD 界面,提供实时的导航指示。
安装插件
首先,你需要在 pubspec.yaml
文件中添加 gmaps_nav_hud_frame
插件的依赖:
dependencies:
flutter:
sdk: flutter
gmaps_nav_hud_frame: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来安装插件。
基本使用
-
导入插件:
在你的 Dart 文件中导入
gmaps_nav_hud_frame
插件:import 'package:gmaps_nav_hud_frame/gmaps_nav_hud_frame.dart';
-
创建 HUD 实例:
你可以通过
GmapsNavHudFrame
类来创建一个 HUD 实例,并将其添加到你的 UI 中。class NavigationScreen extends StatelessWidget { [@override](/user/override) Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Navigation HUD'), ), body: Center( child: GmapsNavHudFrame( onHudTapped: () { // 处理 HUD 点击事件 print('HUD tapped!'); }, hudData: HudData( distance: '1.5 km', nextTurn: 'Turn left', timeToDestination: '10 min', streetName: 'Main Street', ), ), ), ); } }
-
配置 HUD 数据:
HudData
类用于配置 HUD 中显示的数据。你可以设置距离、下一个转弯方向、到达目的地的时间以及当前街道名称等信息。HudData hudData = HudData( distance: '1.5 km', nextTurn: 'Turn left', timeToDestination: '10 min', streetName: 'Main Street', );
-
处理 HUD 点击事件:
你可以通过
onHudTapped
回调来处理用户点击 HUD 的事件。GmapsNavHudFrame( onHudTapped: () { // 处理 HUD 点击事件 print('HUD tapped!'); }, hudData: hudData, );
自定义 HUD 样式
gmaps_nav_hud_frame
插件允许你自定义 HUD 的样式。你可以通过 GmapsNavHudFrame
的构造函数参数来设置不同的样式属性,例如背景颜色、文本颜色、字体大小等。
GmapsNavHudFrame(
onHudTapped: () {
print('HUD tapped!');
},
hudData: hudData,
backgroundColor: Colors.black.withOpacity(0.7),
textColor: Colors.white,
fontSize: 16.0,
);
集成 Google 地图
gmaps_nav_hud_frame
插件通常与 Google 地图插件一起使用。你可以使用 google_maps_flutter
插件来显示地图,并在其上叠加 HUD。
import 'package:google_maps_flutter/google_maps_flutter.dart';
class MapScreen extends StatefulWidget {
[@override](/user/override)
_MapScreenState createState() => _MapScreenState();
}
class _MapScreenState extends State<MapScreen> {
GoogleMapController? mapController;
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Map with HUD'),
),
body: Stack(
children: [
GoogleMap(
onMapCreated: (controller) {
setState(() {
mapController = controller;
});
},
initialCameraPosition: CameraPosition(
target: LatLng(37.7749, -122.4194), // 旧金山
zoom: 14.0,
),
),
Positioned(
bottom: 20,
left: 20,
right: 20,
child: GmapsNavHudFrame(
onHudTapped: () {
print('HUD tapped!');
},
hudData: HudData(
distance: '1.5 km',
nextTurn: 'Turn left',
timeToDestination: '10 min',
streetName: 'Main Street',
),
),
),
],
),
);
}
}