转: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 ...
随机推荐
- Unreal Engine 4 蓝图完全学习教程(五)—— 关于数组
Ⅰ.数组的含义及使用 数组是能统一保存若干数值的特殊变量.数组可以指定编号.运用其中的值,因此能够有序地管理大量的数据. 首先试图将上次创建的msg变量修改成数组,在细节栏点击修改: 并选择“修改变量 ...
- Codeforces_812
A. 每条人行道有六条车道会撞到. #include<bits/stdc++.h> using namespace std; ],b[],c[],d[]; int main() { ios ...
- HDU_2191_多重背包
http://acm.hdu.edu.cn/showproblem.php?pid=2191 简单多重背包题. #include<iostream> #include<cstdio& ...
- Features for Multi-Target Multi-Camera Tracking and Re-identification论文解读
解读一:Features for Multi-Target Multi-Camera Tracking and Re-identification Abstract MTMCT:从多个摄像头采集的视频 ...
- Kafka系列2:深入理解Kafka消费者
Kafka系列2:深入理解Kafka消费者 上篇聊了Kafka概况,包含了Kafka的基本概念.设计原理,以及设计核心.本篇单独聊聊Kafka的消费者,包括如下内容: 生产者是如何生产消息 如何创建生 ...
- 浅谈Go语言的Goroutine和协程
0x00.前言 前面写了一篇初识Go语言和大家一起学习了Go语言的巨大潜力.语言简史.杀手锏特性等,感兴趣的读者可以回顾一下. 今天来学习Go语言的Goroutine机制,这也可能是Go语言最为吸引人 ...
- python中调用函数时,参数顺序与参数赋值问题
设置类和函数如下:class MM(): def ff(self,url(1),method(2),data=None(3),cookie=None(4)): if method.lower()==& ...
- [redis读书笔记] 第一部分 数据结构与对象 对象类型
- 从前面redis的基本数据结构来看,可以看出,redis都是在基本结构(string)的基础上,封装了一层统计的结构(SDS),这样让对基本结构的访问能够更快更准确,提高可控制度. - redis ...
- C++ 基础--虚构函数
virtual 函数 示例代码如下: #include <stdio.h> class base { public: virtual void name(){printf("ba ...
- php 安装 event 和 libevent 扩展
这里使用的是php7.0.24 ,php是yum安装的 一.安装event扩展 用yum无法安装event扩展 手动安装 php 必须要开启 sockets 功能,需要安装php的socket扩展,才 ...