当前位置: 首页 > news >正文

flutter开发多端平台应用的探索 上(基本操作)

前言

Flutter 是一个跨平台的开发框架,它允许开发者使用相同的代码库来构建 iOS、Android、Web 和桌面应用程序。

最近想了想,自己一直在用flutter开发特定端的应用,但是对于其他端的端特性case,如桌面端的菜单、多窗口、鼠标事件,需要怎么处理还没什么概念,本文旨在简单探索这方面的内容。

正文

首先就是判断平台了,可以通过如下方式

import 'dart:io' show Platform;void checkPlatform() {if (kIsWeb) {print('Running on the web.');} else {if (Platform.isAndroid) {print('Running on Android.');} else if (Platform.isIOS) {print('Running on iOS.');} else if (Platform.isLinux) {print('Running on Linux.');} else if (Platform.isMacOS) {print('Running on macOS.');} else if (Platform.isWindows) {print('Running on Windows.');}}
}

手机端权限管理

这里flutter似乎是把这个事交给社区插件来做了,最著名的是permission_handler插件,原理后面探讨,大致用法如下

import 'package:permission_handler/permission_handler.dart';Future<void> requestPermissions() async {var status = await Permission.camera.status;if (!status.isGranted) {await Permission.camera.request();}status = await Permission.location.status;if (!status.isGranted) {await Permission.location.request();}
}

硬件特性

这个是谷歌官方已经为我们抽象出来了用法,比如摄像头有cameraController

import 'package:camera/camera.dart';List<CameraDescription>? cameras;Future<void> main() async {cameras = await availableCameras();runApp(MyApp());
}class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(home: CameraApp(),);}
}class CameraApp extends StatefulWidget {@override_CameraAppState createState() => _CameraAppState();
}class _CameraAppState extends State<CameraApp> {CameraController? controller;@overridevoid initState() {super.initState();controller = CameraController(cameras![0], ResolutionPreset.medium);controller!.initialize().then((_) {if (!mounted) {return;}setState(() {});});}@overridevoid dispose() {controller?.dispose();super.dispose();}@overrideWidget build(BuildContext context) {if (!controller!.value.isInitialized) {return Container();}return AspectRatio(aspectRatio: controller!.value.aspectRatio,child: CameraPreview(controller!),);}
}

监听键盘快捷键

如下demo是监听Ctrl+S这个快捷键的示例

具体来说就是需要LogicalKeySet来接受LogicalKeyboardKey的键盘快捷键,并且使用Shortcuts 小部件来设置快捷键与意图SaveIntent之间的映射关系,意图内部就是保存的具体操作,然后Actions 小部件来定义当某个意图发生时应该执行的动作,需要注意的是shortcuts组件只会监听当前具有焦点的小部件的快捷键事件,所以我们用一个focus包裹并设置autofocus为true,构建时候获取焦点。

import 'package:flutter/material.dart';void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(home: ShortcutKeysApp(),);}
}class ShortcutKeysApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return Shortcuts(shortcuts: {LogicalKeySet(LogicalKeyboardKey.control, LogicalKeyboardKey.keyS): SaveIntent(),},child: Actions(actions: {SaveIntent: SaveAction(),},child: Focus(autofocus: true,child: Builder(builder: (context) {return ElevatedButton(onPressed: () {SaveIntent().dispatch(context);},child: Text('Save'),);},),),),);}
}class SaveIntent extends Intent {const SaveIntent();
}class SaveAction extends Action<SaveIntent> {@overrideObject? invoke(covariant SaveIntent intent) {// Implementprint('Save action invoked');return null;}
}

监听鼠标事件

这个比较简单,用Listener就可以了

  • onPointerDown: 当用户按下鼠标按钮或触摸屏幕时触发。
  • onPointerMove: 当用户移动鼠标或手指时触发。
  • onPointerUp: 当用户释放鼠标按钮或移开手指时触发。
import 'package:flutter/material.dart';class MouseEventsWidget extends StatelessWidget {@overrideWidget build(BuildContext context) {return Listener(onPointerDown: (event) {print('Pointer down at: ${event.position}');},onPointerMove: (event) {print('Pointer move at: ${event.position}');},onPointerUp: (event) {print('Pointer up at: ${event.position}');},child: Container(width: 200,height: 200,color: Colors.blue,child: Center(child: Text('Do something with your mouse here'),),),);}
}

菜单

flutter目前是没有提供桌面菜单的原生支持的, 可以使用第三方插件如menubar 或 flutter_platform_menu_bar

import 'package:menubar/menubar.dart';void setupMenu() {setApplicationMenu([Submenu(label: 'File', children: [MenuItem(label: 'New', onClicked: () => print('New clicked')),MenuItem(label: 'Open', onClicked: () => print('Open clicked')),]),Submenu(label: 'Edit', children: [MenuItem(label: 'Undo', onClicked: () => print('Undo clicked')),MenuItem(label: 'Redo', onClicked: () => print('Redo clicked')),]),]);
}

多窗口

flutter没有提供多窗口支持,可以使用三方插件flutter_multi_window

import 'package:flutter_multi_window/flutter_multi_window.dart';void openNewWindow() async {// 创建新的窗口await FlutterMultiWindow.createWindow('window_key');
}// 处理来自其他窗口的消息
FlutterMultiWindow.setWindowCallback((message) {print('Received message: $message');
});

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 监理工程师职业资格考试
  • 如何在Mac电脑上本地部署Stable Diffusion:详细教程(webUI)
  • 基于SVM的手势识别,SVM工具箱详解,SVM工具箱使用注意事项
  • nnunetv2(一)配置文件和nnUNetv2_convert_MSD_dataset命令
  • JZ62 孩子们的游戏(圆圈中最后剩下的数)
  • 【Hadoop|HDFS篇】HDFS概述
  • 微信小程序知识点(二)
  • Meaven的安装
  • [机器学习]线性回归算法
  • 面向切面:AOP
  • pyflink的窗口
  • MySQL系列—7.内存结构
  • ❤《实战纪录片 1 》原生开发小程序中遇到的问题和解决方案
  • AcWing算法基础课-786第k个数-Java题解
  • 论文速读|利用局部性提高机器人操作的样本效率
  • CSS居中完全指南——构建CSS居中决策树
  • ES6核心特性
  • Java小白进阶笔记(3)-初级面向对象
  • JS实现简单的MVC模式开发小游戏
  • Making An Indicator With Pure CSS
  • React-flux杂记
  • spark本地环境的搭建到运行第一个spark程序
  • spring security oauth2 password授权模式
  • Spring-boot 启动时碰到的错误
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 前端知识点整理(待续)
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 我是如何设计 Upload 上传组件的
  • 一些关于Rust在2019年的思考
  • HanLP分词命名实体提取详解
  • python最赚钱的4个方向,你最心动的是哪个?
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (层次遍历)104. 二叉树的最大深度
  • (二)Kafka离线安装 - Zookeeper下载及安装
  • (函数)颠倒字符串顺序(C语言)
  • .gitignore
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .NET应用架构设计:原则、模式与实践 目录预览
  • ;号自动换行
  • @FeignClient注解,fallback和fallbackFactory
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现
  • [ 隧道技术 ] cpolar 工具详解之将内网端口映射到公网
  • [ 物联网 ]拟合模型解决传感器数据获取中数据与实际值的误差的补偿方法
  • [ 转载 ] SharePoint 资料
  • [100天算法】-x 的平方根(day 61)
  • [2013][note]通过石墨烯调谐用于开关、传感的动态可重构Fano超——
  • [2019.3.5]BZOJ1934 [Shoi2007]Vote 善意的投票
  • [AIGC] MySQL存储引擎详解
  • [C++] 容器适配器:深入理解Stack与Queue的底层原理
  • [C++内存管理]new,delete,operator new,opreator delete
  • [CSS]浮动
  • [hdu 2826] The troubles of lmy [简单计算几何 - 相似]