- 博客(17)
- 收藏
- 关注
原创 EventBus源码主要流程解析
然后重新回到订阅方法,可以看到是把刚刚订阅超找到的方法和订阅者添加到CopyOnWriteArrayList中。并且还有个关键结构叫subscriptionsByEventType,这个容器包含了事件类型和订阅者,可以理解为EventType容器包含N个eventType的订阅队列,一个订阅队列中有多个订阅方法。通过一个SubscriberMethodFinder类查找对应订阅的方法,然后进行订阅。最后可以看见将事件作为参数,对订阅者的订阅方法进行了反射调用,这样就实现了事件分发功能。
2025-12-14 23:40:10
137
原创 Flutter 基于Firebase的鉴权功能集成
本文介绍了一个基于Firebase的统一登录功能封装方案。该方案整合了firebase_auth、google_sign_in和sign_in_with_apple等依赖,提供了Google、Apple、手机号和邮箱四种登录方式。核心内容包括:1)定义统一的返回数据结构FirebaseAuthInfo;2)创建LoginMethod工具类管理登录/登出操作;3)实现四种登录方式的具体逻辑:邮箱登录需配置Applink,手机号登录需配置验证码条数,Google登录支持账号选择,Apple登录获取身份凭证。所有
2025-12-13 11:25:31
285
原创 本地编译FlutterEngine进行定制
本文介绍了本地编译Flutter Engine的方法。首先需要安装gclient、ninja等工具,通过gclient管理Flutter Engine源码下载。编译前需确保engine版本与本地Flutter环境一致,使用gn生成构建文件后,通过ninja完成编译。最后通过指定本地engine路径运行Flutter项目。整个流程包括环境配置、源码下载、参数设置、编译执行等步骤,为开发者提供了定制Flutter Engine的能力。
2025-12-10 09:13:22
242
原创 Flutter国际化flutter_i18n库修改成多个数据源按顺序读取
摘要:本文介绍了对flutter_i18n库的改造,使其支持多数据源读取功能。主要修改包括:1)在FlutterI18nDelegate类中增加_translationList存储多个翻译数据源;2)修改load()方法,使其按顺序尝试读取各数据源,成功即停止;3)保持原有接口兼容性,同时添加对多数据源的支持。改造后的库能在某个数据源读取失败时自动尝试下一个数据源,提高了国际化支持的可靠性。核心改动集中在flutter_i18n_delegate.dart文件中,通过静态列表管理和遍历多个Translati
2025-12-06 13:28:08
153
原创 Flutter国际化资源动态化
本文提出了一种应用内动态更新国际化文本资源的方案,通过本地JSON预置语言配置,结合数据库存储实现快速加载。系统启动时优先加载当前语言资源到内存,后台异步加载其他语言到数据库。支持远程更新机制,通过版本控制实现增量更新和过期数据清理。针对性能问题,方案采用Isolate异步处理大数据、批量插入数据库,并建议减少初始加载数据量。存在的主要问题是首次加载大文件可能导致启动延迟,建议从原生层优化读取或拆分资源文件。该方案避免了频繁发版,实现了多语言资源的动态管理和高效更新。
2025-11-22 23:58:44
150
原创 设计模式汇总
以下内容摘自《Android源码设计模式解析与实战》,为该书的内容总结。定义确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。使用场景确保某个类有且只有一个对象的场景 ,避免产生多个对象消耗过多的资源,或者某种 类型的对象只应该有且只有一个。例如,创建一个对象需要消耗的资源过多,如要访问IO和数据库等资源,这时就要考虑使用单例模式。UML图Client:高层客户端Singleton:单例类优点。
2023-08-04 00:54:14
170
原创 Flutter Navigator 2源码解析
本文深入解析Flutter Navigator2的源码实现。相比Navigator1使用Overlay管理路由,Navigator2采用Router组件,通过RouteDelegate、RouteInformationParser和RouteInformationProvider三个核心参数实现路由管理。文章详细分析了数据流转过程:系统路由操作通过Parser转换为Delegate数据,调用setNewRoutePath后触发rebuild。RouteDelegate的build方法完全暴露渲染流程,替代了
2023-05-08 01:28:32
367
原创 Flutter Navigator 源码解析
本文深入解析了Flutter Navigator1的路由管理机制。首先从MaterialApp的构建过程出发,追踪到WidgetsApp如何封装NavigatorState。重点剖析了push方法的实现逻辑:将Route封装为RouteEntry,通过修改其状态来控制路由行为。文章详细阐述了路由遮罩设计原理,即通过OverlayEntry实现页面叠加效果,并介绍了如何递归获取当前路由路径的方法。最后指出Navigator作为RouteEntry容器,其核心是通过管理RouteEntry状态来实现路由跳转
2023-04-27 01:51:14
453
原创 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
1182
原创 Flutter绘制图片水印
1.考虑到水印不能和图片的整体颜色相近导致看不清,所以这时使用palette_generator库,截取了一部分的图片区域作为样本,取得样本中出现次数最多的色号,然后判断RGB值是偏明还是偏暗,如果偏暗则水印的颜色使用白色,反之亦然。4.将叠加绘制的Canvas转换成文件流,此时可以选择根据原文件流的尺寸进行部分缩放,否则文件流大小将影响整体的处理速度。最后将图片流占用的内存释放即可。2.另一个问题是,渲染的水印如果是文字,文字的大小似乎与系统的缩放比无关,导致渲染出来的字体大小不太完美。
2023-04-05 23:45:20
1361
原创 Retrofit主要流程解析
可以从方法实现中,看见返回值其实是一个代理对象。方法主要分成2部分,第一部分是使用validateServiceInterface()来判定所代理的接口是否满足条件。然后判定接口下的方法是否是接口默认方法或者是静态方法,如果就是普通方法,则使用 loadServiceMethod()来获取ServiceMethod实例。该方法中可以发现,将从retrofit类中,取出CallFactory,放入到CallAdapted中进行执行,最外层的invoke就是实现了CallAdapted的adapt方法()。
2023-04-05 21:14:16
185
原创 Flutter国际化之自动化写入资源文件
遍历excel,按照arb文件格式,写入到arb即可,直接上代码。如果需要生成多种国际化资源文件,修改少部分逻辑即可。
2023-04-03 15:33:25
498
原创 Flutter国际化之查找中文文本功能
然后就是ast节点的判断,判断节点类型是否是简单字符串类型或者是插值字符串类型,并判定是否包含中文的节点,如果判定成功,则过滤掉引号。之后就是findByDart方法,该方法实现了从项目根目录,进行递归查找dart文件的逻辑,并过滤了.g.dart这种文件的过滤,一但查找到dart文件,将使用ast对该文件进行解析。需要新建一个文件,将不要扫描的路径加入,加入后,遍历到路径后就不会进行查找。最近在做国际化相关内容,要求在已经使用的项目中,查找出所有带汉字的变量或常量,然后进行国际化处理。
2023-04-03 15:28:28
454
原创 OkHttp源码主要流程解析
然后在findExistingCallWithHost方法中判断,正在运行的队列和准备队列中,是否有与新加入的请求的请求地址一致的任务,如果有,则将队列中的任务的计数赋给新的请求,让请求相同地址的RealCall持有相同的计数。可以看见在RealInterceptorChain.proceed()中,调用拦截器时,传入的索引是指向下一个拦截器的,这就导致在拦截器实现的方法中,如果调用proceed()时,将会调用下一个拦截器的实现。分析了最基本的链路,下面来看提供的内置5个最基本的拦截器的有什么功能。
2023-04-03 15:04:08
205
1
原创 Flutter的ImageProvider流程解析
此处的imageCache的putIfAbsend并不与Map的同名方法逻辑一致,此处的方法将先判定Key是否存在,存在则直接返回completer,不再走后续逻辑,如不存在则进入loader的回调方法。load方法为子类必须继承的方法,此处将会处理并返回ImageStreamCompleter。所有通过key缓存的cache,将通过内部的链表结构与LRU算法,将以前的cache进行清理,所以在大量图片缓存后,读取原有的图片很容易造成资源浪费,此时就需要在load方法中增加一层基于文件的图片缓存层。
2023-03-18 18:12:02
1009
原创 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
4576
1
原创 Flutter手势源码解析
后面的循环就能看见,hitTestResult将自顶向上循环调用继承HitTestTarget的所有类,这里可以发现RenderObject默认继承了HitTestTarget接口,所以每个RenderBox都会调用handleEvent,默认为空方法,所以正常的RenderObject可以接收事件,只是无法实现具体的逻辑。此处也说明了,如果在Flutter层要直接与Engine的渲染方法进行交互,必须查看相关方法是否进行了单位转换,否则在不同屏幕上的效果会出现单位问题。
2023-03-18 17:48:23
344
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅