记录一下入手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开发中踩过的坑的更多相关文章

  1. vue项目开发中踩过的坑

    一.路由 这两天移动端的同事在研究vue,跟我说看着我的项目做的,子路由访问的时候是空白的,我第一反应是,不会模块没加载进来吧,还是....此处省略一千字... 废话不多说上代码 路由代码 { pat ...

  2. vuejs 开发中踩到的坑

    用 v-for 循环式  每个item的值相等的情况下,会影响v-model的双向绑定: Modal 组件开发,主要用slot 标签来实现 <template> <transitio ...

  3. 那些年,我们在Django web开发中踩过的坑(一)——神奇的‘/’与ajax+iframe上传

    一.上传图片并在前端展示 为了避免前端整体刷新,我们采用ajax+iframe(兼容所有浏览器)上传,这样用户上传之后就可以立即看到图片: 上传前: 上传后: 前端部分html: <form s ...

  4. celery开发中踩的坑

    celery开发中踩的坑 celery连接redis 当使用redis做broker,redis连接需要密码时: BROKER_URL='redis://:xxxxx@127.0.0.1:6379/0 ...

  5. Dcloud开发webApp踩过的坑

    Dcloud开发webApp踩过的坑 一.总结 一句话总结:HTML5+扩展了JavaScript对象plus,使得js可以调用各种浏览器无法实现或实现不佳的系统能力,设备能力如摄像头.陀螺仪.文件系 ...

  6. 项目中踩过的坑之-sessionStorage

    总想写点什么,却不知道从何写起,那就从项目中踩过的坑开始吧,希望能给可能碰到相同问题的小伙伴一点帮助. 项目情景: 有一个id,要求通过当前网页打开一个新页面(不是当前页面),并把id传给打开的新页面 ...

  7. 使用ffmpeg视频编码过程中踩的一个坑

           今天说说使用ffmpeg在写视频编码程序中踩的一个坑,这个坑让我花了好多时间,回头想想,非常多时候一旦思维定势真的挺难突破的.以下是不对的编码结果:                   ...

  8. 记一次SpringBoot 开发中所遇到的坑和解决方法

    记一次SpringBoot 开发中所遇到的坑和解决方法 mybatis返回Integer为0,自动转型出现空指针异常 当我们使用Integer去接受数据库中表的数据,如果返回的数据中为0,那么Inte ...

  9. Flutter开发中的几个常用函数

    几个Flutter开发中的常用函数 /** 返回当前时间戳 */ static int currentTimeMillis() { return new DateTime.now().millisec ...

随机推荐

  1. ovirt kvm嵌套虚拟化

    嵌 套式虚拟nested是一个可通过内核参数来启用的功能.它能够使一台虚拟机具有物理机CPU特性,支持vmx或者svm(AMD)硬件虚拟化.关于 nested的具体介绍,可以看这里 .该特性需要内核升 ...

  2. lua学习之语句篇

    语句 赋值 修改一个变量或者修改 table 中的一个字段的值 多重赋值,lua 先对等号右边的所有元素进行求值,然后再赋值 值的个数小于变量的个数,那么多余的变量就置为 nil 初始化变量,应该为每 ...

  3. 你都这么拼了,面试官TM怎么还是无动于衷

    面试,对于每个人而然并不陌生,可以说是必须经历的一个过程了,小到一场考试,大到企业面试,甚至大型选秀...... 有时自己明明很努力了,但偏偏会在面试环节出了插曲,比如,紧张就是最容易出现的了. 我相 ...

  4. Scala 学习(9)之「函数式编程」

    引用透明 对相同的输入,总是能得到相同的输出. 如果 f(x) 的参数 x 和函数体都是引用透明的,那么函数 f 是纯函数. 违反引用透明的例子 我们可以很清楚的看到,对于相同的输入,第二次调用app ...

  5. 【TensorFlow】TensorFlow基础 —— 模型的保存读取与可视化方法总结

    TensorFlow提供了一个用于保存模型的工具以及一个可视化方案 这里使用的TensorFlow为1.3.0版本 一.保存模型数据 模型数据以文件的形式保存到本地: 使用神经网络模型进行大数据量和复 ...

  6. HessianSharp如何部署到IIS7上?

    第一:添加映射 第二:选择经典

  7. django中Template语言

    Template本身也有自己的语言和语法,用来处理简单的数据显示 常用语法 判断指令 {% if 条件 %}...{%endif%} {% if 条件 %}...{%elif 条件 %}...{%en ...

  8. 详解SkipList跳跃链表【含代码】

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天继续介绍分布式系统当中常用的数据结构,今天要介绍的数据结构非常了不起,和之前介绍的布隆过滤器一样,是一个功能强大原理简单的数据结构.并且 ...

  9. 【Java并发工具类】Java并发容器

    前言 Java并发包有很大一部分都是关于并发容器的.Java在5.0版本之前线程安全的容器称之为同步容器.同步容器实现线程安全的方式:是将每个公有方法都使用synchronized修饰,保证每次只有一 ...

  10. 蓝桥杯ALGO-1,区间k大数查询

    #include<stdio.h> int devide(long a[], int low, int high) { long key = a[high]; while (low< ...