转:Flutter开发中踩过的坑
记录一下入手Flutter后实际开发中踩过的一些坑,这些坑希望后来者踩的越少越好。本文章默认读者已经掌握Flutter初步开发基础。
坑1
问题:在debug模式下,App启动第一个页面会很慢,甚至是黑屏。
解决:请切换到release模式,或者使用flutter build apk 打出来的release包不用修改任何代码就可以解决问题。
坑指数:⭐️⭐️⭐️
坑2
问题:使用官方做法集成现有Android 项目:https://github.com/flutter/flutter/wiki/Add-Flutter-to-existing-apps 。集成后,在debug模式下,ListView、GridView列表滑动若干下后显示白屏。
特别说明:有2个前置条件。一是按照官方的做法集成现有项目,二是Debug模式。缺一不可。如果是默认工程,debug模式下不会有此问题。
解决:使用release模式构建解决,不用修改任何代码。
指数:⭐️⭐️⭐️⭐️ (网上几乎找不到同样问题的解决方案,包括Flutter issue)
坑3
问题:图片加载的缓存机制。Image.file(),Image.network()该不该用
过程说明:图片显示过程大体分为加载+计算+渲染。举个例子,如果是从sdcard下获取一张图片显示。有两种方案:一、使用Flutter 的Image.file()加载 二、配合原生的图片缓存框架+Image.memory()加载二进制数据。
解决:通过对比发现同样的环境下第二种方案在列表中的显示效率更高更快。
结论:原生的图片装载速度比Flutter的图片装载速度更快。(待详细验证)
指数:⭐️
坑4
问题:使用 https://github.com/BaseflowIT/flutter-permission-handler 插件。在除第一个Activity以外的其他activity中请求,权限弹窗只弹第一次,在程序运行期间若再次请求则会报错,也收不到插件的权限结果回调。
特别说明:了解了插件的处理过程后发现,Flutter会根据插件会自动生成一个GeneratedPluginRegistrant类。如下
并且说明该类自动生成,不可修改。所以导致了在程序启动的第一个Activity(FlutterActivity)里把所有插件都注册完。后续不会再进行注册,在注册时会同时将这个Activity示例和插件绑定。因为权限处理和当前Activity耦合度高,不是当前Activity是不会回调activity
的onRequestPermissionsResult方法,这个方法是用户点击了权限取消或者确认后回调的。这个方法不回调的话,插件监听这个方法就会失效,最终导致插件的请求权限逻辑没有走完,导致下次请求时permissionhandler直接报错了。
解决:修改插件,让插件提供一个
public static void setPermissionListener(Activity activity){
Log.e("PermissionHandlerPlugin", "setPermissionListener");
mCurrentActivity = activity;
}
1
2
3
4
监听方法,并在插件请求权限时,走到
ActivityCompat.requestPermissions(mCurrentActivity, requestPermissions, PERMISSION_CODE);
1
的地方将原先绑定的Activity替换成监听的Activity。在需要申请权限的Activity中添加该监听。
特别说明:其他类似跟当前Activity耦合度高的插件可能也会出现这个问题(怀疑插件:image_picker ?)。
问题解决。看似是插件的bug,目前在网上资源中寻找只有这个star也是最高的,虽然才不到三百。(哈哈,网上资源不多)现已联系作者讨论下该问题的最终解决方法。
指数:⭐️⭐️⭐️
坑5
问题:如果你接入Flutter只是想把UI逻辑交给Flutter实现。业务逻辑还是想使用原生的。那么会遇到一个Flutter page和原生的业务通信和生命周期同步的问题。
过程描述:
制定方案1:使用一个Activity,所有的Flutter Page显示销毁时都通过MethodChannel告诉原生,来确保原生资源的调度和销毁。看似可行,但这样的话总感觉第一不太友好,Flutter Page不仅要管自己的逻辑,还要管原生的逻辑。第二,给”一个Activity“设置了局限性。总有使用到两个Activity的时候吧。
制定方案2:采用咸鱼优秀的开源的框架 https://github.com/alibaba/flutter_boost。Flutter Page栈管理统一采用原生的栈管理方式。简述下这个框架的实现逻辑是每一个Activity承载一个FlutterView,同时FlutterView是全局唯一且复用,外加一个将就的使用截图的方式来缓解FlutterView移除所带来的闪屏和黑屏问题,但还是会感觉些许的打开Flutter Page闪屏和黑屏。后面尝试解决这个问题,最终以最小改动的方法解决了这个问题。
解决:自己手动解决了闪屏问题,通过这个问题的交流了解了大神们的Flutter_Boost后续的规划,看好未来他的发展并采用了Flutter_Boost的方案。也期待这个框架为后续Flutter开发者带来福音~ 少踩我这种坑?
指数:⭐️
(后续还有遇到坑的话会持续在这个文章里更新)
————————————————
版权声明:本文为CSDN博主「乐成康」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u014665060/article/details/92071247
转:Flutter开发中踩过的坑的更多相关文章
- vue项目开发中踩过的坑
一.路由 这两天移动端的同事在研究vue,跟我说看着我的项目做的,子路由访问的时候是空白的,我第一反应是,不会模块没加载进来吧,还是....此处省略一千字... 废话不多说上代码 路由代码 { pat ...
- vuejs 开发中踩到的坑
用 v-for 循环式 每个item的值相等的情况下,会影响v-model的双向绑定: Modal 组件开发,主要用slot 标签来实现 <template> <transitio ...
- 那些年,我们在Django web开发中踩过的坑(一)——神奇的‘/’与ajax+iframe上传
一.上传图片并在前端展示 为了避免前端整体刷新,我们采用ajax+iframe(兼容所有浏览器)上传,这样用户上传之后就可以立即看到图片: 上传前: 上传后: 前端部分html: <form s ...
- celery开发中踩的坑
celery开发中踩的坑 celery连接redis 当使用redis做broker,redis连接需要密码时: BROKER_URL='redis://:xxxxx@127.0.0.1:6379/0 ...
- Dcloud开发webApp踩过的坑
Dcloud开发webApp踩过的坑 一.总结 一句话总结:HTML5+扩展了JavaScript对象plus,使得js可以调用各种浏览器无法实现或实现不佳的系统能力,设备能力如摄像头.陀螺仪.文件系 ...
- 项目中踩过的坑之-sessionStorage
总想写点什么,却不知道从何写起,那就从项目中踩过的坑开始吧,希望能给可能碰到相同问题的小伙伴一点帮助. 项目情景: 有一个id,要求通过当前网页打开一个新页面(不是当前页面),并把id传给打开的新页面 ...
- 使用ffmpeg视频编码过程中踩的一个坑
今天说说使用ffmpeg在写视频编码程序中踩的一个坑,这个坑让我花了好多时间,回头想想,非常多时候一旦思维定势真的挺难突破的.以下是不对的编码结果: ...
- 记一次SpringBoot 开发中所遇到的坑和解决方法
记一次SpringBoot 开发中所遇到的坑和解决方法 mybatis返回Integer为0,自动转型出现空指针异常 当我们使用Integer去接受数据库中表的数据,如果返回的数据中为0,那么Inte ...
- Flutter开发中的几个常用函数
几个Flutter开发中的常用函数 /** 返回当前时间戳 */ static int currentTimeMillis() { return new DateTime.now().millisec ...
随机推荐
- 三、Linux系统中的文件类型和文件扩展名
.sock文件也是一类特殊的文件,这类文件通常用在网络之间进行数据连接,如:我们可以启动一个程序来监听客户端的要求,客户端可以通过套接字来进行通信: linux中的文件类型 文件类型介绍 Linux系 ...
- 7.场景5:使用Linux桥的VRRP(L3HA)的高可用性
此场景描述了使用ML2插件和Linux网桥的OpenStack网络服务的高可用性实现. 他的高可用性实施例增强了这样的场景:具有Linux网桥架构的传统使用了keepalived的虚拟路由器冗余协议( ...
- 06讲案例篇:系统的CPU使用率很高,但为啥却找不到高CPU的应用
小结 碰到常规问题无法解释的 CPU 使用率情况时,首先要想到有可能是短时应用导致的问题,比如有可能是下面这两种情况. 第一,应用里直接调用了其他二进制程序,这些程序通常运行时间比较短,通过 top ...
- 如何提取CSDN博客正文内容
document.getElementById("article_content").outerHTML; 在任意的一片博文运行以上代码都可以获得正文内容,但是对于代码.字体都没有 ...
- 发生android.view.ViewRoot$CalledFromWrongThreadException异常的解决方案
在Android平台下,进行多线程编程时,经常需要在主线程之外的一个单独的线程中进行某些处理,然后更新用户界面显示.但是,在主线线程之外的线程中直接更新页面显示的问题是 报异常:android.vie ...
- Android 之采用execSQL和rawQuery方法完成数据的添删改查操作
使用 SQLiteDatabase 操作 SQLite 数据库 [java] view plaincopy /* Android提供了一个名为SQLiteDatabase的类,该类封装了一些操作数据库 ...
- FPGA VGA+PLL+IP核笔记
1.实现了预定功能!整个工程,没有使用例程的25MHZ,全部统一使用50MHZ.2.分辨率使用了800*600@72HZ.3.实现了只显示白色部分,黑色部分RGB == 0,要显示背景色.VGA图形基 ...
- pyinstaller相关问题 & pygame文件打包成exe文件 & 武装飞船 & 飞机大战
自己照书写了一个飞机大战游戏的python程序,想把它打包成一个exe文件,在查阅相关教程并经过数次尝试后终于成功. 安装打包应用 pyinstaller 在cmd命令窗口下pip install p ...
- 独立磁盘冗余阵列-RAID
一.RAID概述 RAID(Redundant Array of Independent Disks)即独立冗余磁盘阵列 磁盘阵列就是.由很多块廉价磁盘 组成的一个容量巨大的卷组.然后在使用不同级别的 ...
- 小cookie,大智慧
Cookie是什么?cookies是你访问网站时创建的数据片段文件,通过保存浏览信息,它们使你的在线体验更加轻松. 使用cookies,可以使你保持在线登录状态,记录你的站点偏好,并为你提供本地化支持 ...