Flutter多屏特性尝鲜

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,内容安全 1000次 1年
对象存储 OSS,恶意文件检测 1000次 1年
简介: 在三月份过去的flutter engage大会中,除了重量级的flutter 2,让flutter适配的机型遍布移动,桌面,web端外,还有支持现在各大厂商踊跃推出的折叠屏的[多屏适配特性](https://devblogs.microsoft.com/surface-duo/flutter-dual-screen-foldable/)。这特性提出的原因是是微软的员工使用flutter给自家的
在三月份过去的flutter engage大会中,除了重量级的flutter 2,让flutter适配的机型遍布移动,桌面,web端外,还有支持现在各大厂商踊跃推出的折叠屏的[多屏适配特性](https://devblogs.microsoft.com/surface-duo/flutter-dual-screen-foldable/)。 这特性提出的原因是是微软的员工使用flutter给自家的Surface Duo多屏设备时,无法很好的适应大屏以及多屏设备。 目前项目工程还是在测试阶段,官方中的[安装方法](http://name.com)年久失修,无法体验的所以笔者趟了坑,在此介绍大致说明多屏特性的原理和体验方式。 ## 特性现状 因为依赖Android的 [Jetpack-androidx.window:window](https://developer.android.com/jetpack/androidx/releases/window) 库,该库也还在alpha阶段,因此flutter主工程尚未接受此PR([framework PR ](https://github.com/flutter/flutter/pull/77156)、[engine PR](https://github.com/flutter/engine/pull/24756))合入flutter主干。所有目前想要体验就必须自己编译engine。 ## 支持哪些设备类型? - Cutout 刘海屏(普通设备) ![](https://ata2-img.oss-cn-zhangjiakou.aliyuncs.com/neweditor/2a58e8aa-2be5-4b51-8d7e-455d2c02a1ac.png) - Hinge多屏折叠设备(中间有物理铰链作为区分的) ![](https://ata2-img.oss-cn-zhangjiakou.aliyuncs.com/neweditor/c7becd04-dcbc-41c2-92e5-6485d719cc9b.png) - Fold单屏折叠设备 ![](https://ata2-img.oss-cn-zhangjiakou.aliyuncs.com/neweditor/d10ae3a8-6f31-4aa9-b248-4444011906ee.png) ## 如何编写适配多种屏幕的代码 对于屏幕信息描述数据结构,沿用[Jetpack-androidx.window:window](https://developer.android.com/jetpack/androidx/releases/window)库对于屏幕描述: ```dart class DisplayFeature { final Rect bounds; final DisplayFeatureType type; final DisplayFeatureState state; } ``` - `bounds` : 绘制区域的矩形大小 - `type` : 设备类型: - `hinge` 多屏折叠设备 - `Cutout`刘海屏 - `Fold`单屏折叠设备 -`state`:设备的此时的折叠姿势 - `halfOpened`折叠90度 - `flat` 摊开180 - `flipped`折叠一页,另一页不可见 - `unknown` 未知 通过使用`MediaQuery.of(context).displayFeatures`接口来获取屏幕个数。`MediaQuery.of(context).hinge`来判断当前的绘制有无中间物理铰链。 下面是最简单的一个分屏代码。通过判断是否存在铰链,走不同的绘制逻辑。 ```dart import 'package:flutter/material.dart'; import 'dart:ui' as ui; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return MaterialApp( home: MyPage(), ); } } class MyPage extends StatelessWidget{ @override Widget build(BuildContext context) { List displayFeatures = MediaQuery.of(context).displayFeatures; print('displayFeatures count:${displayFeatures.length}'); final hinge = MediaQuery.of(context).hinge; if (hinge==null) { print('No hinge'); return Container(child: Text("Single Page"),); } else { print('Hinge is ${hinge.bounds.width} logical pixels wide'); return Container(child: Text('Hinge is ${hinge.bounds.width} logical pixels wide'),); } } } ``` 当应用只在单个屏幕显示时,`MediaQuery.of(context).displayFeatures` 数组大小为0。 `final hinge = MediaQuery.of(context).hinge;`因为没跨屏,为`null` ![](https://ata2-img.oss-cn-zhangjiakou.aliyuncs.com/neweditor/dd28473d-7e69-48f6-a126-ee0590b09201.png) 当用户把应用拖拽到跨屏幕时,`MediaQuery.of(context).displayFeatures` 数组大小为1。 `final hinge = MediaQuery.of(context).hinge;`不为空。 ![](https://ata2-img.oss-cn-zhangjiakou.aliyuncs.com/neweditor/1121afab-e6c7-4764-8846-b24845dd066b.gif) 自此就可以根据不同的设备、屏幕的个数来定制不同情况的界面。 ## 如何编译 需要体验这个功能,还需要准备flutter engine的编译环境,这里不展开了。[https://github.com/flutter/flutter/wiki/Setting-up-the-Engine-development-environment](https://github.com/flutter/flutter/wiki/Setting-up-the-Engine-development-environment) 环境搭建好了后 #### 1.需要重新修改.gclient文件,将engine版本指向微软开发的折叠特性分支中 ```bash solutions = [ { "managed": False, "name": "src/flutter", "url": "https://github.com/andreidiaconu/engine.git@foldable_support", "deps_file": "DEPS", "safesync_url": "", }, ] target_os = ['ios','android'] ``` #### 2.在engine目录执行 `gclient sync ` 这一步是下载对应的依赖库 #### 3.在src/flutter/tools/cipd/android_embedding_bundle 下执行gradle updateDependencies 完成后 将src/flutter/tools/cipd/android_embedding_bundle/lib/window-java-1.0.0-alpha08.jar 移动到 src/tools/cipd/android_embedding_bundle/ *为什么要手动拷贝?* 因为添加了androidx.window:window-java依赖。按正常逻辑,需要将Android的依赖jar包上传到cipd服务器上,但是只有google员工有上传权限,所以这里只能直接放在在src/tools/cipd/android_embedding_bundle/以直接提供给gn编译。 新增的android依赖库 src/flutter/tools/cipd/android_embedding_bundle/build.gradle ``` android { compileSdkVersion 30 dependencies { ... embedding "androidx.window:window-java:1.0.0-alpha08" } } ``` #### 4.运行编译 ``` ./flutter/tools/gn --android --android-cpu x64 --unoptimized ./flutter/tools/gn --unoptimized ./flutter/tools/gn --android --unoptimized ninja -C out/host_debug_unopt ninja -C out/android_debug_unopt_x64 ninja -C out/android_debug_unopt ``` #### 5 运行本地engine环境配置: engine编译好后,需要把AndroidStudio以及工程中使用flutter指向本地的engine。 ##### 5.1 添加参数指向本地engine --local-engine-src-path /your/engine/src --local-engine android_debug_unopt_x64 ![](https://ata2-img.oss-cn-zhangjiakou.aliyuncs.com/neweditor/1b6efdff-6d5a-4684-a824-dcde2ed096a7.png) ![](https://ata2-img.oss-cn-zhangjiakou.aliyuncs.com/neweditor/c4949e98-2aa2-4e3a-9857-e0214c59debe.png) ##### 5.2 将AndroidStudio的flutter工程指向 https://github.com/andreidiaconu/flutter.git 这一步需要将库clone下来,并切换到对应分支 ``` git clone https://github.com/andreidiaconu/flutter.git git checkout -b foldable_support origin foldable_support ``` ![](https://ata2-img.oss-cn-zhangjiakou.aliyuncs.com/neweditor/e92cb3d7-c9f6-4ad7-835b-ec162e3d1b20.png) ##### 5.3 pubspec.yaml中将系统库sky_engine和sky_services都指向本地 pubspec.yaml ``` dependency_overrides: sky_engine: path: /Users/xx/Documents/code/engine/src/out/host_debug_unopt/gen/dart-pkg/sky_engine sky_services: path: /Users/xx/Documents/code/engine/src/out/host_debug_unopt/gen/dart-pkg/sky_services ``` ##### 5.4 下载Surface Duo模拟器 * [下载模拟器](https://docs.microsoft.com/zh-cn/dual-screen/android/emulator/surface-duo-download?tabs=windows) * 解压到任意文件夹 * 运行SurfaceDuoEmulator_2021.630.4目录中的 .run.sh 即可运行 6. 最后运行工程即可 ![](https://ata2-img.oss-cn-zhangjiakou.aliyuncs.com/neweditor/82b6f5bf-bf72-4d48-9ef0-c0d22f5778aa.png) ## 存在的问题以及讨论 * 接口不稳定 这套多屏特性是基于AndroidX的[Jetpack-androidx.window:window](https://developer.android.com/jetpack/androidx/releases/window)库进行开发,而这个库还在不停的迭代中,接口可能有变化,所有flutter官方未采纳这个PR合入到主干 * 未支持iOS 虽然iOS尚未有多屏设备,但是这个库中有也有针对大屏做的分屏特性,对于iPad开发有非常好的应用场景。 ![](https://ata2-img.oss-cn-zhangjiakou.aliyuncs.com/neweditor/1321b76a-de2a-4971-b76f-77592a34df87.png) * 用户量少,存在bug可能较多 目前因为使用的用户量较少,测试的场景未得到充分的测试,可能会存在较多的bug。 * 对应多屏设备或者大屏设备开发友好 通过试例代码可以知道,多屏的逻辑可以在同一份代码中编写,不同屏幕的绘制代码在同一份文件里面。数据的交互非常友好。 ## 最后 和微软这位作者的邮件聊天中得知,他现在非常欢迎大家使用本特性,在使用的过程有各种不爽或者bug都非常欢迎提出意见。 引用: > 总介绍 > https://devblogs.microsoft.com/surface-duo/flutter-dual-screen-foldable/ > Surface Duo 安卓模拟器 > https://docs.microsoft.com/zh-cn/dual-screen/android/emulator/?WT.mc_id=docs-surfaceduoblog-andreidiaconu > Demo > https://github.com/microsoft/flutter-dualscreen > framework PR > https://github.com/flutter/flutter/pull/77156 > engine PR > https://github.com/flutter/engine/pull/24756 > Android折叠屏相关api > https://developer.android.com/codelabs/android-window-manager-dual-screen-foldables?hl=zh-cn#1 > 折叠屏状态 > https://developer.android.com/guide/topics/ui/foldables#postures > androidx.window版本信息 > https://developer.android.com/jetpack/androidx/releases/window
相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
相关文章
|
1月前
|
Android开发 iOS开发 容器
鸿蒙harmonyos next flutter混合开发之开发FFI plugin
鸿蒙harmonyos next flutter混合开发之开发FFI plugin
|
6天前
|
传感器 前端开发 Android开发
在 Flutter 开发中,插件开发与集成至关重要,它能扩展应用功能,满足复杂业务需求
在 Flutter 开发中,插件开发与集成至关重要,它能扩展应用功能,满足复杂业务需求。本文深入探讨了插件开发的基本概念、流程、集成方法、常见类型及开发实例,如相机插件的开发步骤,同时强调了版本兼容性、性能优化等注意事项,并展望了插件开发的未来趋势。
19 2
|
5月前
|
开发框架 前端开发 测试技术
Flutter开发常见问题解答
Flutter开发常见问题解答
|
1月前
|
开发者
鸿蒙Flutter实战:07-混合开发
鸿蒙Flutter混合开发支持两种模式:1) 基于har包,便于主项目开发者无需关心Flutter细节,但不支持热重载;2) 基于源码依赖,利于代码维护与热重载,需配置Flutter环境。项目结构包括AppScope、flutter_module等目录,适用于不同开发需求。
79 3
|
23天前
|
传感器 开发框架 物联网
鸿蒙next选择 Flutter 开发跨平台应用的原因
鸿蒙(HarmonyOS)是华为推出的一款旨在实现多设备无缝连接的操作系统。为了实现这一目标,鸿蒙选择了 Flutter 作为主要的跨平台应用开发框架。Flutter 的跨平台能力、高性能、丰富的生态支持和与鸿蒙系统的良好兼容性,使其成为理想的选择。通过 Flutter,开发者可以高效地构建和部署多平台应用,推动鸿蒙生态的快速发展。
162 0
|
25天前
|
Dart 安全 UED
Flutter&鸿蒙next中的表单封装:提升开发效率与用户体验
在移动应用开发中,表单是用户与应用交互的重要界面。本文介绍了如何在Flutter中封装表单,以提升开发效率和用户体验。通过代码复用、集中管理和一致性的优势,封装表单组件可以简化开发流程。文章详细讲解了Flutter表单的基础、封装方法和表单验证技巧,帮助开发者构建健壮且用户友好的应用。
63 0
|
1月前
|
开发框架 移动开发 Android开发
安卓与iOS开发中的跨平台解决方案:Flutter入门
【9月更文挑战第30天】在移动应用开发的广阔舞台上,安卓和iOS两大操作系统各自占据半壁江山。开发者们常常面临着选择:是专注于单一平台深耕细作,还是寻找一种能够横跨两大系统的开发方案?Flutter,作为一种新兴的跨平台UI工具包,正以其现代、响应式的特点赢得开发者的青睐。本文将带你一探究竟,从Flutter的基础概念到实战应用,深入浅出地介绍这一技术的魅力所在。
84 7
|
1月前
|
编解码 Dart API
鸿蒙Flutter实战:06-使用ArkTs开发Flutter鸿蒙插件
本文介绍了如何开发一个 Flutter 鸿蒙插件,实现 Flutter 与鸿蒙的混合开发及双端消息通信。通过定义 `MethodChannel` 实现 Flutter 侧的 token 存取方法,并在鸿蒙侧编写 `EntryAbility` 和 `ForestPlugin`,使用鸿蒙的首选项 API 完成数据的读写操作。文章还提供了注意事项和参考资料,帮助开发者更好地理解和实现这一过程。
71 0
|
1月前
|
Dart Android开发
鸿蒙Flutter实战:03-鸿蒙Flutter开发中集成Webview
本文介绍了在OpenHarmony平台上集成WebView的两种方法:一是使用第三方库`flutter_inappwebview`,通过配置pubspec.lock文件实现;二是编写原生ArkTS代码,自定义PlatformView,涉及创建入口能力、注册视图工厂、处理方法调用及页面构建等步骤。
61 0
|
2月前
|
JSON Dart Java
flutter开发多端平台应用的探索
flutter开发多端平台应用的探索
52 6
下一篇
无影云桌面