转: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 ...
随机推荐
- VS生成垃圾文件清理
@echo Off del /s /a *.txt *.exe *.suo *.ncb *.user *.dll *.pdb *.netmodule *.aps *.ilk 2>nul FOR ...
- 《Android Studio实战 快速、高效地构建Android应用》--Android Studio操作
前言 摩尔定律:CPU的处理能力大约18个月翻一倍 Android&Java:想要在Android Studio中开发Android App,必须以充分了解Java为前提(Java流行的原因: ...
- RocketMQ重试机制和消息幂等
一.重试机制 由于MQ经常处于复杂的分布式系统中,考虑网络波动,服务宕机,程序异常因素,很有可能出现消息发送或者消费失败的问题.因此,消息的重试就是所有MQ中间件必须考虑到的一个关键点.如果没有消息重 ...
- Uncaught Error: Call to undefined function mcrypt_get_iv_size() 解决办法
函数 mcrypt_get_iv_size 在只在(PHP 4 >= 4.0.2, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0) 这几个版本 ...
- SELinux 和 iptables 开启关闭
SELinux 是 2.6 版本的 Linux 内核中提供的强制访问控制(MAC)系统.对于目前可用的 Linux安全模块来说,SELinux 是功能最全面,而且测试最充分的,它是在 20 年的 MA ...
- nCompass-网络流量基础知识
nCompass-网络流量基础知识 1. 流量分析基础知识 1.1 常见的流量分析方式: SNMP: 网管平台通过主动式获取设备接口流量信息. Flow:网络设备将穿越的数据流信息精简压缩打包. ...
- Java集合效率问题
凑算式 B DEFA + --- + ------- = 10 C GHI (如果显示有问题,可以参见[图1.jpg]) 这个算式中A~I代表1~9的数字,不同的字母代表不同的数字. 比如:6+8/3 ...
- SpringCloud学习之—Eureka集群搭建
Eureka集群的搭建 上次说过了在SpringCloud应用中使用Eureka注册中心,用来对服务提供者进行服务注册与发现,但同时,它也是一个"微服务",单个应用使用空间有限,因 ...
- 微信小程序入门笔记-小程序创建(2)
1.工具下载 官方链接:https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html 我选用的是稳定版 macOS 2 ...
- Linux报错:rm: cannot remove 'xxx': Is a directory
rm: cannot remove 'xxx': Is a directory表示这个文件是无法remove移除的,因此我们不能仅使用rm来将这个文件夹进行删除,需要使用: rm -rf 命令则可以将 ...