自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(12)
  • 收藏
  • 关注

原创 设计模式汇总

以下内容摘自《Android源码设计模式解析与实战》,为该书的内容总结。定义确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。使用场景确保某个类有且只有一个对象的场景 ,避免产生多个对象消耗过多的资源,或者某种 类型的对象只应该有且只有一个。例如,创建一个对象需要消耗的资源过多,如要访问IO和数据库等资源,这时就要考虑使用单例模式。UML图Client:高层客户端Singleton:单例类优点。

2023-08-04 00:54:14 71

原创 Flutter Navigator 2源码解析

熟悉还说从Route的build方法看起,可以发现build方法实现的十分简单,只是将routeRelegate的build进行渲染,这说明了routeRelegate参数的build参数将替代 Navigator1中用Overlay进行实现的情况,将全部的渲染流程都暴露出来。这时再看initState(),就明白Prodiver进行监听的意义:将系统的路由栈的操作,通过parser转换成delegate相应的数据,然后赋值给setNewRoutePath,最后重新rebuild()。

2023-05-08 01:28:32 212

原创 Flutter Navigator 源码解析

Flutter路由管理,目前出现2个版本:1.0和2.0,本文将解析Navigator1.0的源码流程,以及针对路由功能的不足如何进行增强。

2023-04-27 01:51:14 284

原创 Flutter自定义语法检查器

dart sdk版本:2.19.6analyzer.plugin版本:5.10.0自定义Flutter Lint插件实现自己的Dart语法规则 - 掘金在一个dart/flutter项目下,新建tools/analyzer_plugin路径。bin文件夹与plugin.dart为必须,且plugin.dart的方法结构必须固定,否则可以看见web页面上输出错误。然后pubspec.yaml依赖analyzer_plugin。为什么要定义这个结构?

2023-04-11 00:40:50 666

原创 Flutter绘制图片水印

1.考虑到水印不能和图片的整体颜色相近导致看不清,所以这时使用palette_generator库,截取了一部分的图片区域作为样本,取得样本中出现次数最多的色号,然后判断RGB值是偏明还是偏暗,如果偏暗则水印的颜色使用白色,反之亦然。4.将叠加绘制的Canvas转换成文件流,此时可以选择根据原文件流的尺寸进行部分缩放,否则文件流大小将影响整体的处理速度。最后将图片流占用的内存释放即可。2.另一个问题是,渲染的水印如果是文字,文字的大小似乎与系统的缩放比无关,导致渲染出来的字体大小不太完美。

2023-04-05 23:45:20 1018

原创 Retrofit主要流程解析

可以从方法实现中,看见返回值其实是一个代理对象。方法主要分成2部分,第一部分是使用validateServiceInterface()来判定所代理的接口是否满足条件。然后判定接口下的方法是否是接口默认方法或者是静态方法,如果就是普通方法,则使用 loadServiceMethod()来获取ServiceMethod实例。该方法中可以发现,将从retrofit类中,取出CallFactory,放入到CallAdapted中进行执行,最外层的invoke就是实现了CallAdapted的adapt方法()。

2023-04-05 21:14:16 80

原创 Flutter国际化之自动化写入资源文件

遍历excel,按照arb文件格式,写入到arb即可,直接上代码。如果需要生成多种国际化资源文件,修改少部分逻辑即可。

2023-04-03 15:33:25 267

原创 Flutter国际化之查找中文变量

然后就是ast节点的判断,判断节点类型是否是简单字符串类型或者是插值字符串类型,并判定是否包含中文的节点,如果判定成功,则过滤掉引号。之后就是findByDart方法,该方法实现了从项目根目录,进行递归查找dart文件的逻辑,并过滤了.g.dart这种文件的过滤,一但查找到dart文件,将使用ast对该文件进行解析。需要新建一个文件,将不要扫描的路径加入,加入后,遍历到路径后就不会进行查找。最近在做国际化相关内容,要求在已经使用的项目中,查找出所有带汉字的变量或常量,然后进行国际化处理。

2023-04-03 15:28:28 224

原创 OkHttp源码主要流程解析

然后在findExistingCallWithHost方法中判断,正在运行的队列和准备队列中,是否有与新加入的请求的请求地址一致的任务,如果有,则将队列中的任务的计数赋给新的请求,让请求相同地址的RealCall持有相同的计数。可以看见在RealInterceptorChain.proceed()中,调用拦截器时,传入的索引是指向下一个拦截器的,这就导致在拦截器实现的方法中,如果调用proceed()时,将会调用下一个拦截器的实现。分析了最基本的链路,下面来看提供的内置5个最基本的拦截器的有什么功能。

2023-04-03 15:04:08 124 1

原创 Flutter ImageProvider流程解析

此处的imageCache的putIfAbsend并不与Map的同名方法逻辑一致,此处的方法将先判定Key是否存在,存在则直接返回completer,不再走后续逻辑,如不存在则进入loader的回调方法。load方法为子类必须继承的方法,此处将会处理并返回ImageStreamCompleter。所有通过key缓存的cache,将通过内部的链表结构与LRU算法,将以前的cache进行清理,所以在大量图片缓存后,读取原有的图片很容易造成资源浪费,此时就需要在load方法中增加一层基于文件的图片缓存层。

2023-03-18 18:12:02 721

原创 Flutter在Android上的热更新方案

注意:此时当下载到新文件时,必须将新文件从公共路径(转移/写入)到/data/user/0/packageName路径以下,由上面link的日志可以看出,/data/data路径是可允许的加载路径,而/data/data是/data/user/0的软连接,且data/user/0/packageName路径下是拥有可读可写权限的。并且此时注入到args的路径,必定顺序在源代码定义lib加载路径之前,由此可以得出自定义路径可以替代原路径进行加载。且公共目录会出现jni路径检查错误。具体原因可见方案1。

2023-03-18 18:05:13 3442 1

原创 Flutter手势源码解析

后面的循环就能看见,hitTestResult将自顶向上循环调用继承HitTestTarget的所有类,这里可以发现RenderObject默认继承了HitTestTarget接口,所以每个RenderBox都会调用handleEvent,默认为空方法,所以正常的RenderObject可以接收事件,只是无法实现具体的逻辑。此处也说明了,如果在Flutter层要直接与Engine的渲染方法进行交互,必须查看相关方法是否进行了单位转换,否则在不同屏幕上的效果会出现单位问题。

2023-03-18 17:48:23 176

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除