- 博客(448)
- 资源 (22)
- 问答 (1)
- 收藏
- 关注
原创 Android群英传:神兵利器——出版祭
Android群英传:神兵利器《Android群英传:神兵利器》——看上去好像是第一本书的续集,但实际上,这本书的内容,在我写《Android群英传》的时候就已经写了不少了,碍于出版社的篇幅限制与主题的统一,很多内容并没有放到《Android群英传》中。由于第一本书上市后,受到各位开发者的抬爱,销售情况还算理想,所以出版社一直希望我能出一本续集,因此,我便萌生了想要把这本书补全的想法。
2016-08-18 10:10:56 22722 74
原创 对不起!我来晚了!——《Android群英传》出版祭
对不起!我来晚了!——《Android群英传》出版祭历时将近一年,我的第一本书终于就要出版了,虽然经历种种曲折,历经磨难,最终还是赶在八月份的尾巴上,修成正果。 首先,要向大家道歉,本来预计是在6月份上市的书,一拖再拖,直到现在才得以出版,让不少朋友一等再等,这里,向这些朋友的耐心,狠狠的点个赞。写书之前其实,当官杨主编第一次找我写书的时候,其实我是,是想拒绝的,我跟女朋友讲,我拒绝,因为,
2015-09-08 22:02:59 37351 163
原创 向产品宣战——开发者眼中的Android UI Design
向产品宣战——开发者眼中的Android UI Design 准备了半个月,思考产品设计、交互设计,见证了公司的产品、UE和开发的撕逼,将自己的思考、感悟,整理成下文,谨代表广大程序猿,向设计狮、产品X开战。希望广大程序猿能够坚持贯彻Google的Material Design,切实认真负责的执行Android的设计思想,将MD设计带到产品中去,不做中国特色的App。
2015-06-09 14:18:21 32461 169
原创 解放双手——Android自动化测试
人们懒的走路,才创造了汽车;人们懒的爬楼,才创造了电梯;人们懒的扫地,才创造了自动扫地机器人。人类的进步,离不开这些喜欢偷懒的人,现在,程序猿将偷懒上升到了一个新的高度——利用程序来进行自动化软件测试,将测试工程师从繁琐的测试用例中解脱出来,从此可以一边喝着咖啡,一边看着程序自动测试,不必看着测试用例重复无数次的测试步骤,也不必担心操作失误而导致不必要的错误,更不用担心压力测试而导致的身心俱疲。想了解程序猿是如
2015-05-11 16:42:06 66241 72
原创 Eclipse,到了说再见的时候了——Android Studio最全解析
去年的Google大会上,Google带给我们一个小玩具——Android Studio,说它是玩具,是因为它确实比较菜,界面过时,操作不流畅,效率也不高,但是现在,虽然版本还是0.6,甚至都没到1.0,但是我们可以发现亲儿子到底是亲儿子,现在的Android Studio已经今非昔比,用了一段时间,简直爱不释手,我觉得,It's time to say goodbye eclipse!本文将带领
2014-06-14 17:24:26 42578 99
原创 我也来开发2048之终极奥义
本次教程跟之前隔了不少时间哈,有点忘记了的建议先看看前面的熟悉下,今天我准备把这个2048给结束了,拖了这么久。按照惯例,我们已经把准备工作都做好了,今天这一部分信息量比较大,也是整个游戏的核心所在,所以我准备分功能来讲,最后大家结合源码来看就不会感觉太吃力了。1、初始化游戏 初始化的时候,我们要干嘛呢,首先要看配置,配置了几行,然后先画好面板,然后要给在面板上随机生成2个数字Item,这涉及到2
2014-04-27 13:39:39 30818 367
原创 Android拼图游戏开发全纪录1
今天我们继续来讲解Android拼图游戏全纪录的第二篇,今天要完成的任务比较简单:界面布局和资源文件1资源文件:我们在开发一个项目的时候,首先要定下这个App的基调,是小清新呢还是重口味,所以我们需要定义一些颜色、style等首先是颜色等: #000000 #FFFFFF #F56A47 #FFFFFF #727
2014-01-31 11:39:51 26305 61
原创 现代化Flutter架构-Riverpod应用层
点击上方蓝字关注我,知识会给你力量在构建复杂的应用程序时,我们可能会发现自己编写的逻辑:依赖于多个数据源或Repository需要被多个Widget使用(共享)在这种情况下,很容易将逻辑放在已有的类(Widget或Repository)中。但这会导致关注点分离不畅,使我们的代码更难阅读、维护和测试。事实上,关注点分离是我们需要一个好的应用架构的首要原因。在本文中,我们将专注于应用层,学习如何在 F...
2024-12-16 08:30:23 685
原创 现代化Flutter架构-Riverpod表现层
点击上方蓝字关注我,知识会给你力量在编写 Flutter 应用程序时,将业务逻辑与 UI 代码分离是非常重要的。这将使我们的代码更易于测试和推理,当我们的应用程序变得越来越复杂时,这一点尤为重要。为了实现这一点,我们可以使用设计模式在应用程序的不同组件之间引入关注点分离。作为参考,我们可以采用分层应用程序架构,如图所示:这一次,我们将重点关注表现层,学习如何使用Controller来:保存业务逻辑...
2024-12-11 08:30:57 949
原创 现代化Flutter架构-Riverpod领域层
点击上方蓝字关注我,知识会给你力量你是否曾将用户界面、业务逻辑和网络代码混杂在一起,成为一捆乱七八糟的意大利面代码?我知道我曾这样做过。✋毕竟,真实世界的应用程序开发是很困难的。领域驱动设计(DDD)等书籍就是为了帮助我们开发复杂的软件项目而编写的。DDD 的核心在于模型,它捕捉了解决当前问题所需的重要知识和概念。一个好的领域模型可以决定一个软件项目的成败。模型非常重要,但不能孤立存在。即使是最简...
2024-12-09 08:30:13 928
原创 现代化Flutter架构-Riverpod数据层
点击上方蓝字关注我,知识会给你力量设计模式是帮助我们解决软件设计中常见问题的有用模板。说到应用程序架构,结构设计模式可以帮助我们决定如何组织应用程序的不同部分。在这种情况下,我们可以使用Repository模式从各种来源(如后端 API)访问数据对象,并将它们作为类型安全的实体提供给应用程序的领域层(即我们的业务逻辑的所在层)。在本文中,我们将详细了解Repository Pattern:它是什么...
2024-12-02 08:35:59 1019
原创 现代化Flutter架构-Riverpod简介
点击上方蓝字关注我,知识会给你力量在构建复杂的应用程序时,选择正确的应用程序架构至关重要,因为它可以让您构建代码,并在代码库增长时为其提供支持。良好的架构应能帮助您处理复杂性,而不会碍手碍脚。但要做到这一点并不容易:架构 “不足 ”,会导致代码条理不清,缺乏明确的规范架构 “过多 ”,会导致过度工程化,即使是简单的更改也很难进行在实践中,事情可能会有很多细微差别,要取得正确的平衡也很棘手。因此,在...
2024-11-26 08:30:43 1354
原创 为 TheRouter 的 AGP8 编译加个速
点击上方蓝字关注我,知识会给你力量背景AGP8 的变更应该很多人都知道了,移除了Transform API,所以很多 class 操作类的插件代码都需要改了。TheRouter在开发的时候就支持了AGP8,使用的也是Gradle提供的标准 API。详细可见官方示例仓库:https://github.com/android/gradle-recipes/blob/agp-8.7/transformA...
2024-11-04 08:30:18 1007
原创 微信朋友圈的技术选型竟然是...
点击上方蓝字关注我,知识会给你力量随着鸿蒙Next版本的正式上线,相信有很多朋友都已经体验到了原生原味儿版的微信,这也是鸿蒙Next系统里程碑式的一步,毕竟微信这种国民级的App如果能适配,那么后面鸿蒙的适配之路即将走的更加顺畅。相信不少公司的朋友们已经在适配或者已经适配鸿蒙系统了,不得不说,重头来做一个App,确实是一个比较大的挑战,特别是对一些已经迭代了近十年的巨型App来说,那更是一个人力和...
2024-10-30 08:30:09 679
原创 使用FVM轻松管理Flutter版本
点击上方蓝字关注我,知识会给你力量FVM(Flutter Version Manager)是一个在单设备上,轻松的切换Flutter版本的工具,同时可以保证项目开发成员的版本相同,避免产生API差异。它的文档非常清晰,使用也非常简单。官网地址:https://fvm.app/在官网上找到对应平台的安装指令。Github:https://github.com/leoafarias/fvm常用指令如下...
2024-09-25 08:30:32 924
原创 使用Riverpod Lint & Riverpod Snippets更高效的创建Flutter Apps
点击上方蓝字关注我,知识会给你力量随着每一个新版本的发布,Riverpod 及其生态系统都在不断完善:核心软件包为反应式缓存和数据绑定提供了强大的应用程序接口Riverpod Generator 软件包简化了学习曲线并带来了显著的可用性改进(我在这里已经介绍过了)Riverpod Snippets扩展帮助我们轻松创建提供者和消费者新的 Riverpod Lint 添加了许多有用的Lint和重构选项...
2024-09-09 08:30:32 1592
原创 如何在新的Flutter Riverpod Generator中使用Notifier和AsyncNotifier
点击上方蓝字关注我,知识会给你力量随着 riverpod_generator 软件包的推出,使用 Riverpod 编写 Flutter 应用程序变得容易多了。使用新的 Riverpod 语法,我们可以使用 @riverpod 注解,让 build_runner 即时生成所有providers。我已经在前文中介绍了所有基础知识。在本文中,我们将进一步了解在 Riverpod 2.0 中添加的 No...
2024-09-02 08:30:39 1518
原创 使用Flutter Riverpod Generator来自动创建Providers
点击上方蓝字关注我,知识会给你力量Riverpod 是 Flutter 功能强大的反应式缓存和数据绑定框架。它为我们提供了许多不同类型的provider,我们可以用它们来:访问代码中的依赖关系(使用 Provider)缓存来自网络的异步数据(使用 FutureProvider 和 StreamProvider)管理本地应用程序状态(使用 StateProvider、StateNotifierPro...
2024-08-22 08:30:24 1106
原创 从源码看Flutter状态栏高度之谜
点击上方蓝字关注我,知识会给你力量写过Android的开发者都知道,关于状态栏高度的计算,Google改了一版又一版,依然还有很多兼容性问题,那么来到Flutter这边,问题突然变得简单了,通过下面的方法就可以很方便的获取。MediaQuery.of(context).padding.top本来很开心的完成任务了,直到有同事反馈这个方法有时获取的状态栏高度为0,但有时候又是对的,很奇怪,那么到底是...
2024-08-12 08:39:48 1385
原创 纯血鸿蒙 璀璨星河
点击上方蓝字关注我,知识会给你力量华为最近可谓是加班加点,前段时间华为给出了鸿蒙系统的计划表,让大家都摩拳擦掌,想看看华为到底有几把刷子,这次的621HDC大会,就是华为给全世界的第一个交待。最近在网上经常流传着这样一张图:大体意思就是:根据Counterpoint Research报告显示,今年一季度,鸿蒙在中国市场份额为17%,而苹果的iOS为16%。这意味着,鸿蒙在中国市场首次超越iOS,成...
2024-06-21 18:01:59 1503
原创 Flutter局部刷新三剑客
点击上方蓝字关注我,知识会给你力量局部刷新作为提高Flutter页面性能的重要手段,是每一个Flutter老手都必须掌握的技巧。当然,我们不用非得使用Riverpod、Provider、Bloc这些状态管理工具来实现局部刷新,Flutter框架本身也给我们提供了很多方便快捷的刷新方案,今天要提的就是Notifier三剑客,用它来处理局部刷新,代码优雅又方便,可谓是居家必备之良器。ChangeNo...
2024-06-19 08:30:20 1410
原创 从Flutter范儿的单例来看Dart的构造函数
点击上方蓝字关注我,知识会给你力量单例模式单例模式应该是设计模式中使用的最广泛的一种设计模式了,在Kotlin中,甚至为它单独创建了一个语法糖——object类,来快速实现单例模式,而在Dart中,并没有像Kotlin这样的语法糖,所以,参考单例的一般实现,我们可以很容易的实现下面这样一个单例。classSingleton{staticSingleton?_instance;...
2024-05-07 08:30:15 1346 1
原创 从源码看Flutter Android端的启动流程
点击上方蓝字关注我,知识会给你力量Flutter容器Flutter在Android中的渲染载体就是Flutter容器,通常是以Activity和Fragment的形式承载,虽然也有FlutterView,但是需要单独处理的关联方法太多,所以不太建议使用,这篇文章将分析Flutter在Android中的加载和启动流程,了解Flutter是如何在Android中加载并渲染的。小小Android,eas...
2024-04-07 08:30:45 1303
原创 Flutter鸿蒙终端一体化—鹊桥相会
点击上方蓝字关注我,知识会给你力量在鸿蒙中开发Flutter项目,一个最大的问题,就是「不太会写鸿蒙代码」,这对于一个Flutter开发者来说,虽然不是一件很麻烦的事,但由于现在鸿蒙的版本和文档还略有一些混乱,所以要写好还是有一些麻烦的,所以,秉着能用工具解决的问题就不要自己写的原则,我们参考Native的Flutter Channel的实现,也就是pigeon的方式,不熟悉的同学可以参考我之前的...
2024-03-18 08:30:07 1342
原创 Flutter鸿蒙终端一体化-天下一统
点击上方蓝字关注我,知识会给你力量在前面的文章中,我们了解了如何使用FlutterPage来创建Flutter容器。Flutter鸿蒙终端一体化-混沌初开Flutter鸿蒙终端一体化-珠联璧合但更多的时候,我们需要的是一种类似FlutterFragment的方式来进行引用,可喜的是,鸿蒙实现这种方式也并不复杂,因为不论是FlutterPage,还是FlutterFragment,它内部实际上是通过...
2024-03-12 08:30:44 2395
原创 Flutter鸿蒙终端一体化-珠联璧合
点击上方蓝字关注我,知识会给你力量在上一篇文章中,我们初步了解了在鸿蒙中使用Flutter的可能性和可用性,还没看过的可以参考下面的链接。Flutter鸿蒙终端一体化-混沌初开在文章的最后,我们分析了两种混编模式,和Android、iOS类似,分别是源码依赖和产物依赖,在我们的项目中,由于很早之前就开始介入Flutter开发,同时抽象了一套Flutter的轻量级渲染模式,所以,这里我们会使用产物依...
2024-01-31 08:30:27 3986 1
原创 Flutter鸿蒙终端一体化-混沌初开
点击上方蓝字关注我,知识会给你力量环境配置欲练此功,必先仔细阅读此项目的README文件十遍以上。flutter_flutter项目,这是我们整个工程的核心,但是很多人都倒在了第一步,其原因,就是——需要使用Dev分支!!!https://gitee.com/openharmony-sig/flutter_flutter/tree/dev/当前项目已经支持Linux、Mac、Windows环境下使...
2024-01-24 08:30:33 2851
原创 真•文本环绕问题的探究和分享
点击上方蓝字关注我,知识会给你力量前言上周领导安排了一个任务:希望我们的动态展示不是固定把图片展示在文本的上面或者下面,希望图片放在文本内容里,也不需要很复杂的效果,就排版好看就行。Ok,这不就是富文本吗,我一下子就联想到了RichText,一想到RichText支持WidgetSpan,我就知道问题不大,但是经过测试发现这里面是个大坑......话不多说,先展示一下本地Demo的实际效果图:--...
2023-10-20 08:30:17 701 1
原创 为 TheRouter 开发一个 IDEA 插件
点击上方蓝字关注我,知识会给你力量为 TheRouter 开发一个 IDEA 插件❝本插件代码已全部开源,走过路过请给个star:https://github.com/kymjs/TheRouterIdeaPlugin❞这篇文章是假定你已经有了 idea 插件开发的入门知识,来教你如何实现一个实际项目的功能。如果你还不知道如何开发一个插件,建议先从这个链接查看官网相关文档 https://plu...
2023-10-12 08:30:34 560
原创 Flutter混编方案在起点客户端的实践之路
点击上方蓝字关注我,知识会给你力量起点读书客户端一直紧跟新技术的潮流,从很早开始,就在进行Flutter的尝试,在筹备了许久之后(移除了包大小的KPI指标),我们终于在最新的业务开发中,使用了Flutter。Flutter虽然会带来一些包体积的增加,但带来的收益却是:愉悦的开发体验,不用再忍受漫长的编译,强大的热更新可以快速进行UI开发跨端的统一UI设计,双端不用做太多的适配就可以运行开发效率提升...
2023-09-26 08:30:34 676
原创 Android编译的小知识
背景Android是如何进行编译的? 项目中的源代码是如何一步步被执行为可以安装到手机上的apk的? 文章会一一给大家介绍,尽量以代码为例,好让大家快速理解。文末有福利~1.认识Gradle1.1 Gradle简介官方文档:https://docs.gradle.org/7.3.3/userguide/what_is_gradle.html官方解释:Gradle是一个开源的自动化构建工具。 现...
2023-09-19 08:30:28 1344
原创 hwui介绍与分析
hwui全称**HardwareAcceleratedRenderingEngineforUI,**hwui是一个基于GPU加速的2D图形引擎。HWUI的目标是提供高效、稳定、高质量的2D图形渲染能力,为Android系统的UI体验提供技术支持。相关源码位于目录android/platform/framework/base/libs/hwui文末有福利~hwui的大部分代码以C++实现,Andro...
2023-09-07 08:30:59 1542 1
原创 Flutter性能揭秘之RepaintBoundary
点击上方蓝字关注我,知识会给你力量Flutter会在屏幕上绘制Widget。如果一个Widget的内容需要更新,那就只能重绘了。尽管如此,Flutter同样会重新绘制一些Widget,而这些Widget的内容仍有部分未被改变。这可能会影响应用程序的执行性能,有时影响会非常巨大。如果您正在寻找一种方法,来防止不必要的部分重绘,您可以考虑利用RepaintBoundary。在这篇博客理,我们将探讨Fl...
2023-08-18 19:59:43 343
原创 当我用ChatGPT摸了一上午鱼,结果......
点击上方蓝字关注我,知识会给你力量经常有人问我,ChatGPT出来这么久了,你怎么不写点教程(割点韭菜)呢?其实,从它一出来,我就关注了,也在平时的工作中进行了使用,正好最近在处理一个埋点的问题,就拿ChatGPT来进行下演示吧,看我怎么用ChatGPT来摸鱼,解决我们平时遇到的问题。问题是这样的,相信很多朋友也遇到过,那就是RecyclerView的Item曝光埋点问题。最开始对埋点数据要求不高...
2023-07-05 08:30:34 330
原创 从Kotlin中return@forEach了个寂寞
点击上方蓝字关注我,知识会给你力量今天在Review(copy)同事代码的时候,发现了一个问题,想到很久之前,自己也遇到过这个问题,那么就来看下吧。首先,我们抽取最小复现代码。(1..7).forEach{if(it==3){return@forEach}Log.d("xys","Num:$it")}很简单的代码,我相信很多人都这样写...
2023-06-12 08:30:19 999
原创 FlutterComponent最佳实践之Widget Lifecycle
点击上方蓝字关注我,知识会给你力量了解Flutter的生命周期,是我们写出优雅的App的基石,通过生命周期的适配,可以让代码更加稳健,鲁棒性更好。Widget生命周期下面这张图,就展示了一个Widget的整体生命周期示例。当你把BuildContext分配给Widget时,一个内部标志位—mounted会被设置为true。这会让Framework知道这个Widget目前已经挂载到Widget Tr...
2023-04-11 08:30:16 524
原创 FlutterComponent最佳实践之国际化
点击上方蓝字关注我,知识会给你力量在Android中,我们可以通过不同的strings.xml文件来实现国际化的不同语言需求,那么在Flutter中,官方同样也提供了国际化的适配方案,官方文档如下所示。https://docs.flutter.dev/development/accessibility-and-localization/internationalization本地化与国际化本地化(...
2023-04-04 08:30:03 524
原创 从源码看Flutter BuildContext的秘密
点击上方蓝字关注我,知识会给你力量我们每次在写Flutter代码的时候,都会看到这个参数——BuildContext,在Android开发中,也经常看见一个类似的东西——Context,它们是不是一样的呢?其实说一样也对,它们都是上下文的关键承载者,但是却也不一样,因为它们本质上是两个不同的概念。在Flutter中,BuildContext的源码如下。从注释中我们就可以看出,[BuildConte...
2023-03-28 08:30:46 608
原创 FlutterComponent最佳实践之Widget尺寸
点击上方蓝字关注我,知识会给你力量在Flutter和在Native中,对一个Widget的尺寸测量,一直都是一个非常麻烦的事情,大部分时间,我们都是按照约束和具体的尺寸来进行布局,但有些时候,我们不得不拿到动态的Widget尺寸来实现自己的一些布局策略。通常来说,我们会有三方面的需求。测量自己的尺寸测量Parent的尺寸测量Child的尺寸测量自己的尺寸要获取你自身的Widget尺寸,其实只需要通...
2023-03-21 08:44:21 745
原创 FlutterComponent最佳实践之Timer的妙用
点击上方蓝字关注我,知识会给你力量Timer在Flutter中,通常是用来构建延时的异步任务的,在讲解它的妙之前,我们先来看看Timer的基操。Timer基操Timer广义上可以理解为一个倒计时器,它从创建到结束会经历下面三个过程:Creates a timerExecutes a callbackThe timer finishes创建一个Timer非常简单。finaltimer=Time...
2023-03-14 08:30:47 677
Fragment使用动画问题
2014-09-01
TA创建的收藏夹 TA关注的收藏夹
TA关注的人