转: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 ...
随机推荐
- 基于 H5 和 webGL 的 3d 智慧城市
前言 中共中央.国务院在今年12月印发了<长江三角洲区域一体化发展规划纲要>(下文简称<纲要>),并发出通知,要求各地区各部门结合实际认真贯彻落实. <纲要>强调, ...
- java2变量数据类型和运算符
public class jh_11_加加减减运算符 { public static void main(String[] args) { int a = 5,b =2 ; a ++;// 对自身 ...
- 《Head first设计模式》之命令模式
命令模式将"请求"封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持可撤销的操作. 一个家电公司想邀请你设计一个家电自动化遥控器的API.这个遥控器有7个 ...
- 文件图片上传目录 禁止执行php
apache配置上传目录禁止运行php的方法 导读: 禁止上传目录运行php等可执行文件可以从一定程度上增加网站的安全性, 禁止上传目录运行php的方法可以用.htaccess文件, 也可以直接在ap ...
- OSPF理论
OSPF简介 OSPF(Open Shortest Path First 开放式最短路径优先)协议是IETF为IP网络开发的IGP路由选择协议.它是一种典型的链路状态(link-state)路由协议. ...
- U盘模式无法引导进入pe系统
有些笔记本.一体机 特别是win8.win10系统维护时需要 通过u盘进入pe系统,就是进不去,需要到bios中更改一下设置. 1.首先我们将已经使用u启动u盘启动盘制作 ...
- php-fpm.conf.default配置文件
;;;;;;;;;;;;;;;;;;;;; ; FPM Configuration ; ;;;;;;;;;;;;;;;;;;;;; ; All relative paths in this confi ...
- java连接Oracle数据库,从ResultSet中提取数据出现java.sql.sqlException结果集已耗尽
出现错误的原因是ResultSet中并没有任何东西,再调用next()方法就会出错,原因可能是oracle创建用户,表没有提交,commit即可
- linux系统初装
一.linux系统安装 VMware workstation是一个虚拟机软件,它的主要作用是在原有操作系统(windows或linux)下,虚拟出一台电脑,你可以在这台虚拟电脑上安装不同的操作系统,进 ...
- 2020/1/4 H5&&C3笔记
1. 类名不能由数字开头 2.float 是float 属性定义元素在哪个方向浮动.有left / right / none / inherit四个 参考https://www.w3school.co ...