使用Flutter开发Ubuntu应用如何实现演示模式全屏切换
Flutter Ubuntu端演示模式自动切换全屏实现方案
直接用桌面端窗口控制插件实现即可,不需要自己写Linux原生桥接代码,步骤如下:
- 第一步:添加依赖
项目中引入window_manager插件,这是目前Flutter桌面端兼容性最好的窗口控制库,对Ubuntu下GNOME、KDE等主流桌面环境均适配完善,无额外系统依赖。在项目根目录的pubspec.yaml中添加如下依赖:
保存后执行dependencies: flutter: sdk: flutter window_manager: ^0.3.9flutter pub get完成依赖安装。 - 第二步:初始化窗口控制能力
修改程序入口main.dart的代码,在runApp之前完成窗口插件的初始化,否则Linux端会出现控制指令不生效的问题:import 'package:flutter/material.dart'; import 'package:window_manager/window_manager.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); // 必须调用该初始化方法,桌面端窗口控制才能正常工作 await windowManager.ensureInitialized(); runApp(const MyApp()); } - 第三步:实现演示模式切换逻辑
不要使用移动端的SystemChrome.setEnabledSystemUIMode相关API,这套逻辑在Linux桌面端完全无效,直接调用window_manager提供的全屏控制方法即可。在你的演示模式切换按钮/触发逻辑中加入如下代码:// 演示模式状态标记 bool _isPresentationMode = false; /// 切换演示模式 Future<void> _handlePresentationModeToggle() async { setState(() { _isPresentationMode = !_isPresentationMode; }); if (_isPresentationMode) { // 进入演示模式:开启系统级真全屏,自动隐藏系统顶栏、任务栏 await windowManager.setFullScreen(true); // 可选配置:将窗口固定在最上层,避免演示过程中被其他弹窗/窗口遮挡 await windowManager.setAlwaysOnTop(true); } else { // 退出演示模式:关闭全屏,恢复窗口原有尺寸和位置 await windowManager.setFullScreen(false); // 取消窗口置顶 await windowManager.setAlwaysOnTop(false); } } - 第四步:补全桌面端交互适配
桌面端用户习惯按ESC键退出全屏/演示模式,建议给幻灯片页面添加键盘监听,避免交互不符合预期:@override Widget build(BuildContext context) { return Focus( autofocus: true, onKeyEvent: (node, event) { // 演示模式下按ESC自动退出 if (event.logicalKey == LogicalKeyboardKey.escape && _isPresentationMode) { _handlePresentationModeToggle(); return KeyEventResult.handled; } return KeyEventResult.ignored; }, child: // 此处放置你的幻灯片页面主体内容 ); }
踩坑提示:如果后续将应用打包为严格沙箱模式的Snap包,需要在打包配置中声明desktop接口权限,否则全屏控制会被沙箱拦截;debug模式、Deb包安装模式下无需额外配置即可正常运行。
内容的提问来源于stack exchange,提问作者con ko
相关产品推荐
相关产品推荐

