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显示。

推荐仅在步行时使用逐向导航的抬头显示功能。

已知问题包括每次都需要请求通知权限(偶尔权限可能不会出现在批准/未批准列表中——可以尝试卸载并重新安装作为解决方法)。后台模式或屏幕关闭尚未测试。显示仅在应用程序点击“停止”时清除,而不是在浮动操作按钮取消时清除。


指令

  1. 点击唤醒Frame,然后在应用程序中点击“连接”以连接到Frame,再点击“启动”以将应用程序加载到Frame上。
  2. 接着点击导航的浮动操作按钮,接受通知权限以开始。
  3. 应用程序会监听主机设备上正在运行的现有或任何新的Google Maps实时导航会话的通知,并将导航方向镜像到Frame显示。
    • 对于现有的实时导航会话,通知大约每分钟更新一次,因此你可能需要等待一分钟才能看到第一次更新。
    • 对于新的导航会话,通知应该立即更新。
  4. 导航结束后,点击“停止”和“断开连接”,以从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),
            ),
          ],
        ),
      ),
    );
  }
}

说明

  1. 依赖项

    • 使用了flutter_notification_listener插件来监听系统通知。
    • 需要在pubspec.yaml中添加依赖项:
      dependencies:
        flutter_notification_listener: ^0.2.0
  2. 关键逻辑

    • NotificationListenerService.startListening() 开始监听通知事件。
    • NotificationListenerService.stopListening() 停止监听通知事件。
    • 通过回调函数 _onNotificationReceived 更新UI显示。
  3. 权限申请

    • 在AndroidManifest.xml中添加权限:
      <uses-permission android:name="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE" />
1 回复

更多关于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 来安装插件。

基本使用

  1. 导入插件

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

    import 'package:gmaps_nav_hud_frame/gmaps_nav_hud_frame.dart';
  2. 创建 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',
              ),
            ),
          ),
        );
      }
    }
  3. 配置 HUD 数据

    HudData 类用于配置 HUD 中显示的数据。你可以设置距离、下一个转弯方向、到达目的地的时间以及当前街道名称等信息。

    HudData hudData = HudData(
      distance: '1.5 km',
      nextTurn: 'Turn left',
      timeToDestination: '10 min',
      streetName: 'Main Street',
    );
  4. 处理 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',
              ),
            ),
          ),
        ],
      ),
    );
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!