群英传

其他

纯血鸿蒙 璀璨星河

点击上方蓝字关注我,知识会给你力量华为最近可谓是加班加点,前段时间华为给出了鸿蒙系统的计划表,让大家都摩拳擦掌,想看看华为到底有几把刷子,这次的621HDC大会,就是华为给全世界的第一个交待。最近在网上经常流传着这样一张图:大体意思就是:根据Counterpoint
6月21日 下午 6:01
其他

Flutter局部刷新三剑客

点击上方蓝字关注我,知识会给你力量局部刷新作为提高Flutter页面性能的重要手段,是每一个Flutter老手都必须掌握的技巧。当然,我们不用非得使用Riverpod、Provider、Bloc这些状态管理工具来实现局部刷新,Flutter框架本身也给我们提供了很多方便快捷的刷新方案,今天要提的就是Notifier三剑客,用它来处理局部刷新,代码优雅又方便,可谓是居家必备之良器。
6月19日 上午 8:30
其他

从Flutter范儿的单例来看Dart的构造函数

点击上方蓝字关注我,知识会给你力量单例模式单例模式应该是设计模式中使用的最广泛的一种设计模式了,在Kotlin中,甚至为它单独创建了一个语法糖——object类,来快速实现单例模式,而在Dart中,并没有像Kotlin这样的语法糖,所以,参考单例的一般实现,我们可以很容易的实现下面这样一个单例。class
5月7日 上午 8:30
其他

从源码看Flutter Android端的启动流程

点击上方蓝字关注我,知识会给你力量Flutter容器Flutter在Android中的渲染载体就是Flutter容器,通常是以Activity和Fragment的形式承载,虽然也有FlutterView,但是需要单独处理的关联方法太多,所以不太建议使用,这篇文章将分析Flutter在Android中的加载和启动流程,了解Flutter是如何在Android中加载并渲染的。小小Android,easy
4月7日 上午 8:30
其他

Flutter鸿蒙终端一体化—鹊桥相会

点击上方蓝字关注我,知识会给你力量在鸿蒙中开发Flutter项目,一个最大的问题,就是「不太会写鸿蒙代码」,这对于一个Flutter开发者来说,虽然不是一件很麻烦的事,但由于现在鸿蒙的版本和文档还略有一些混乱,所以要写好还是有一些麻烦的,所以,秉着能用工具解决的问题就不要自己写的原则,我们参考Native的Flutter
3月18日 上午 8:30
其他

Flutter鸿蒙终端一体化-天下一统

点击上方蓝字关注我,知识会给你力量在前面的文章中,我们了解了如何使用FlutterPage来创建Flutter容器。Flutter鸿蒙终端一体化-混沌初开Flutter鸿蒙终端一体化-珠联璧合但更多的时候,我们需要的是一种类似FlutterFragment的方式来进行引用,可喜的是,鸿蒙实现这种方式也并不复杂,因为不论是FlutterPage,还是FlutterFragment,它内部实际上是通过FlutterView的方式来创建的,所以,很快就有开发者提了PR,让鸿蒙可以支持FlutterFragment的方式进行开发,这个组件就是——FlutterEntry,原始PR地址如下。https://gitee.com/openharmony-sig/flutter_engine/pulls/116使用还是相当简单的,添加生命周期的依赖注入即可。和FlutterPage的使用很类似,FlutterEntry也提供了getDartEntrypointArgs、configureFlutterEngine等方法,仿照Native的封装思路,我们也封装下FlutterEntry。arktsimport
3月12日 上午 8:30
其他

Flutter鸿蒙终端一体化-珠联璧合

点击上方蓝字关注我,知识会给你力量在上一篇文章中,我们初步了解了在鸿蒙中使用Flutter的可能性和可用性,还没看过的可以参考下面的链接。Flutter鸿蒙终端一体化-混沌初开在文章的最后,我们分析了两种混编模式,和Android、iOS类似,分别是源码依赖和产物依赖,在我们的项目中,由于很早之前就开始介入Flutter开发,同时抽象了一套Flutter的轻量级渲染模式,所以,这里我们会使用产物依赖的方式进行混编开发,这也和Native开发保持一致。Flutter混编方案在起点客户端的实践之路混编的这两种方式各有利弊,我们先来看下这两种方式的工程结构。下面是以Flutter工程为主的鸿蒙混编项目结构,和纯Flutter工程结构基本一致,鸿蒙的Native功能,都写在ohos目录下,这就是一个完整的鸿蒙Native工程,可以直接使用DevECO
1月31日 上午 8:30
其他

Flutter鸿蒙终端一体化-混沌初开

点击上方蓝字关注我,知识会给你力量环境配置欲练此功,必先仔细阅读此项目的README文件十遍以上。flutter_flutter项目,这是我们整个工程的核心,但是很多人都倒在了第一步,其原因,就是——需要使用Dev分支!!!https://gitee.com/openharmony-sig/flutter_flutter/tree/dev/当前项目已经支持Linux、Mac、Windows环境下使用。首先,按照README的指引,配置好鸿蒙相关的SDK和环境变量,主要是ohpm与sdkmanager,参考README中给出的地址配置即可,需要注意的是版本要对应。目前该项目对应的官方Flutter版本是3.7。接下来,配置命令行签名工具,同样是按照指引,需要注意的是签名工具这个项目,需要使用gradle7.1和Java11进行编译,在Mac下,可以很方便的使用brew来安装Java环境,在编译签名工具的时候,将环境变量中的Java11的注释放开即可。shellexport
1月24日 上午 8:30
其他

Flutter混编方案在起点客户端的实践之路

点击上方蓝字关注我,知识会给你力量起点读书客户端一直紧跟新技术的潮流,从很早开始,就在进行Flutter的尝试,在筹备了许久之后(移除了包大小的KPI指标),我们终于在最新的业务开发中,使用了Flutter。Flutter虽然会带来一些包体积的增加,但带来的收益却是:愉悦的开发体验,不用再忍受漫长的编译,强大的热更新可以快速进行UI开发跨端的统一UI设计,双端不用做太多的适配就可以运行开发效率提升一倍以上,同时也提升设计和测试的效率千呼万唤始出来,让我们来看下起点读书客户端是如何进行Flutter混编开发的。轻量化引擎架构由于起点读书客户端目前依然是以原生开发为主,所以我们在嵌入Flutter模块时,首先要考虑的就是使用哪种混合栈方案。目前市面上常见的混合栈方案,主要就是两种:一种是以Flutter
2023年9月26日
其他

Flutter性能揭秘之RepaintBoundary

点击上方蓝字关注我,知识会给你力量Flutter会在屏幕上绘制Widget。如果一个Widget的内容需要更新,那就只能重绘了。尽管如此,Flutter同样会重新绘制一些Widget,而这些Widget的内容仍有部分未被改变。这可能会影响应用程序的执行性能,有时影响会非常巨大。如果您正在寻找一种方法,来防止不必要的部分重绘,您可以考虑利用RepaintBoundary。在这篇博客理,我们将探讨Flutter中的RepaintBoundary。我们将看到如何实现RepaintBoundary的演示程序以及如何在您的flutter应用程序中使用它。RepaintBoundaryRepaintBoundary类是Null安全的。首先,你需要了解什么是Flutter中的RepaintBoundary。它是一个为它的Child设置不同的展示层级的Widget。这个Widget为它的Child设置了一个不同的展示层级,如果一个子树与它周围的部分相比,会在意想不到的短时间内重新绘制,Flutter建议你使用RepaintBoundary来进一步提高性能。为什么需要使用RepaintBoundary呢。Flutter
2023年8月18日
其他

当我用ChatGPT摸了一上午鱼,结果......

点击上方蓝字关注我,知识会给你力量经常有人问我,ChatGPT出来这么久了,你怎么不写点教程(割点韭菜)呢?其实,从它一出来,我就关注了,也在平时的工作中进行了使用,正好最近在处理一个埋点的问题,就拿ChatGPT来进行下演示吧,看我怎么用ChatGPT来摸鱼,解决我们平时遇到的问题。问题是这样的,相信很多朋友也遇到过,那就是RecyclerView的Item曝光埋点问题。最开始对埋点数据要求不高的时候,埋点代码,都是直接写在onBindViewHolder�里的,这是最简单的方式,但是问题在于RecyclerView的预加载会创建一些页面不可见的缓存Item,这就导致了曝光数据不准,所以,当产品突然要求更加精准的曝光埋点时,这种方式就显得手足无措了。这个问题的解决,国际上大致有两种方案。一种是基于Adapter,在滚动停止时,计算当前firstVisible和lastVisible,并与上次的记录进行对比,从而计算出曝光的Item,这种方式也是简单有效,但是弊端在于统计粒度比较粗,如果以后产品要按照「Item展示大于x%才算曝光」,这样就无法实现了。那么另一种方案,就是计算当前View的已经绘制的Rect和原始Rect的对比,从而可以推断当前View的曝光状态,类似airbnb的epoxy,就是这种方案https://github.com/airbnb/epoxy,这种方式的定制程度就比较高了,但是稍微复杂一点,需要处理好监听的管理,否则会有一些性能压力。ok,现在压力给到ChatGPT,让我们来看看它是如何解决这个问题的,下面的这些截图,就是我和ChatGPT的完整对话过程,首先,我们把问题抛给ChatGPT,当然,最开始我们需要给它一个比较宽泛的问题,然后再一步步引导它将答案具化。看来ChatGPT还是信手拈来。接下来将问题具化到我们的RecyclerView。由于是使用Kotlin,所以我的思路是尽量不改原来的代码,所以,拓展函数来一个?这时候已经有点意思了。ChatGPT果然是老实人,我说锁屏你就真的只管锁屏?有点扯了,算了,先实现方案,后面再处理。这个我还真没想到,之前对这种方案了解不对,还真是小刀划腚子。不得不说,ChatGPT还是很听劝的,也很有礼貌,对于我的指责,能够好好反省。但当我把它的代码copy到项目里面去运行,才发现了一堆新的问题。不得不说,你创造API的能力是一流的。态度挺好,但是,这错的是不是有点多啊,能不能一次改完?终于改完了,我们现在在试试变更需求,看它能不能理解。不错,再加点难度。这时候,ChatGPT就突然变蠢了,改了好几次都不能完成这个需求。越改bug越多。到这个时候,我已经失去耐心了,这个bug来来回回改了这么多次,依然有问题,也许是跟我对话时间太长,变蠢了?总而言之,我花了一个上午的时间想利用ChatGPT来摸鱼,但最后发现竟然比我自己做还累??我不仅要检查它的思路是否正确,还得给它解bug?其实这个问题并不复杂,我们在问它之前,已经有一些思路了,但是最终ChatGPT并没有生成完整能符合需求的代码,不过这也不能全怪ChatGPT,它毕竟只是一个出道两年的练习生而已。虽然忙了一上午没摸成鱼,但是我们也进一步了解了ChatGPT,不可否认,它的确有用,但还不足以能威胁到我的饭碗。那么我们能利用ChatGPT摸什么鱼吗,当然是可以的。首先,你可以一定程度上替代搜索引擎,虽然有些问题它有些瞎扯淡,但是比起百度来说,我觉得还是更胜一筹的,很多简单的问题,基本就可以放弃百度了,直接ChatGPT就好了。其次,你可以借助ChatGPT来给你提供思路,虽然它的代码不一定能完全满足你的需求,但它的思路,基本还是符合国际惯例的,有时候甚至还能给你一些惊喜。最后,ChatGPT是需要调教的,别指望一下子就能给你很完善的回答,你需要一步步引导它,但对于像我这个level的程序员来说,这就好像在面试一个出道两年的练习生,有点惊喜,但不多,更多的是无奈,回答不到点子上。当我用ChatGPT摸了一上午鱼,结果......我浪费了一上午!!!向大家推荐下我的网站
2023年7月5日
其他

从Kotlin中return@forEach了个寂寞

点击上方蓝字关注我,知识会给你力量今天在Review(copy)同事代码的时候,发现了一个问题,想到很久之前,自己也遇到过这个问题,那么就来看下吧。首先,我们抽取最小复现代码。(1..7).forEach
2023年6月12日
其他

FlutterComponent最佳实践之Widget Lifecycle

点击上方蓝字关注我,知识会给你力量了解Flutter的生命周期,是我们写出优雅的App的基石,通过生命周期的适配,可以让代码更加稳健,鲁棒性更好。Widget生命周期下面这张图,就展示了一个Widget的整体生命周期示例。当你把BuildContext分配给Widget时,一个内部标志位—mounted会被设置为true。这会让Framework知道这个Widget目前已经挂载到Widget
2023年4月11日
自由知乎 自由微博
其他

FlutterComponent最佳实践之国际化

点击上方蓝字关注我,知识会给你力量在Android中,我们可以通过不同的strings.xml文件来实现国际化的不同语言需求,那么在Flutter中,官方同样也提供了国际化的适配方案,官方文档如下所示。https://docs.flutter.dev/development/accessibility-and-localization/internationalization本地化与国际化本地化(Localization)指的是:使程序支持显示数字、货币、日期和复数的本地格式,因为对于另一个地区来说,这些可能是不同的展示样式。国际化(Internationalization)指的是:使应用程序在特定的地区表现不同的语言展示。国际化包括创建多个基于本地的语言文件、assets等等。flutter_localizations的使用当然,官方的方案是比较传统的方案,社区里有很多工具,可以极大的简化国际化的处理流程,让我们可以很快的进行国际化适配,这里使用到的就是一个名为「Flutter
2023年4月4日
其他

从源码看Flutter BuildContext的秘密

点击上方蓝字关注我,知识会给你力量我们每次在写Flutter代码的时候,都会看到这个参数——BuildContext,在Android开发中,也经常看见一个类似的东西——Context,它们是不是一样的呢?其实说一样也对,它们都是上下文的关键承载者,但是却也不一样,因为它们本质上是两个不同的概念。在Flutter中,BuildContext的源码如下。从注释中我们就可以看出,[BuildContext]对象实际上是[Element]对象。[BuildContext]接口是用来阻止对[Element]对象的直接操作,它就是为了避免直接操纵Element类而创建的。❝Element是Flutter
2023年3月28日
其他

FlutterComponent最佳实践之Widget尺寸

点击上方蓝字关注我,知识会给你力量在Flutter和在Native中,对一个Widget的尺寸测量,一直都是一个非常麻烦的事情,大部分时间,我们都是按照约束和具体的尺寸来进行布局,但有些时候,我们不得不拿到动态的Widget尺寸来实现自己的一些布局策略。通常来说,我们会有三方面的需求。测量自己的尺寸测量Parent的尺寸测量Child的尺寸测量自己的尺寸要获取你自身的Widget尺寸,其实只需要通过RenderBox即可获取。Size
2023年3月21日
其他

FlutterComponent最佳实践之Timer的妙用

点击上方蓝字关注我,知识会给你力量Timer在Flutter中,通常是用来构建延时的异步任务的,在讲解它的妙之前,我们先来看看Timer的基操。Timer基操Timer广义上可以理解为一个倒计时器,它从创建到结束会经历下面三个过程:Creates
2023年3月14日
其他

Flutter中的异步执行策略

点击上方蓝字关注我,知识会给你力量在Flutter中,如何执行一段延迟执行的异步代码?我们可以找到下面这些方法。scheduleMicrotaskFuture.microtaskFutureFuture.delayedTimer.runWidgetsBinding.addPostFrameCallbackSchedulerBinding.addPostFrameCallback你可能会说,这是相当多的选择,但是它们彼此之间有些什么异同呢?Event
2023年3月9日
其他

Flutter布局指南之约束和尺寸

点击上方蓝字关注我,知识会给你力量Flutter布局总纲——向下传递约束,向上传递尺寸。Box约束约束是Flutter布局的核心,在Flutter中,约束的表现形式是通过Constraints类来实现的,所有的非滚动布局模型,都通过BoxConstraints来进行约束,它的代码如下。从上面的代码可以看出,约束本质上就是「宽」「高」上的「最大」「最小」范围。BoxConstraints具有传递性,约束会在组件树上传递,当前Widget会受到来自父级的约束,同时也会将约束传递给它的子Widget。通过一个例子,我们来理解下约束是如何进行传递的。void
2023年3月6日
其他

FlutterComponent最佳实践之动画的显和隐

点击上方蓝字关注我,知识会给你力量Flutter中包含大量的动画组件和自定义动画方式,所以,在合适的场景下选择合适的动画实现方式就成了决定代码质量好坏的一个重要因素。动画选择决策树Flutter中的动画从广义上来讲可以分为两类,一类是基于绘制的动画(Drawing-based
2023年2月28日
其他

Flutter混编工程之异常处理

);}封装下面我们将前面的异常处理方式都合并到一起,并针对EngineGroup的多入口处理,封装一个类,代码如下所示。class
2023年2月6日
其他

闲言碎语-第八期

点击上方蓝字关注我,知识会给你力量时间一晃就过去了,22年的总结还没来得及写,转眼已经2023年了。22年对于很多人来说,应该都是比较魔幻的一年,特别是在上海的朋友,一小半的时间都在居家办公,疫情不仅影响了工作,更影响了经济,很多人收入降级、失业,或是离开上海,完全放开后,大部分人都经历了一次痛苦的感染过程,一时间朋友圈全是新冠诊断现场直播,好在经历过这一次感染后,大部分人都回归了正常的生活轨道,希望23年,是复苏的一年,让大家把失去的东西都能再找回来。生命不息,折腾不止。几年前,我用Ghost、腾讯云服务器、COS搭建了自己的一套网站和文章的管理备份方案,目的是为了能够更好的管理文档,但随着这几年写的文档越来越多,我逐渐发现了这种方式的一些缺点,比如多端同步比较麻烦,资源管理复杂,本地文档管理精细度不够等等,所以,再三权衡比较之后,我准备将所有的文档都迁移到「语雀」,当然,这篇文章绝不是一篇推广,下面我将说说原因。首先,语雀的编辑器吸收了各大MD编辑器的优点,是我目前使用体验最好的MD编辑器,这点很重要,毕竟这将是我码字的主战场。其次,富文本内容丰富,可以很方便的插入各种富文本,例如「计划」、「流程图」、「语雀内容」等等。再次,资源管理更加方便了,图片直接可以复制到文章中,不用再上传COS了,这点也很重要,MD最大的缺点,就是对图片的管理,非常依赖图床,否则MD的使用就非常不方便。最后,就是语雀的文档管理功能确实非常强大,知识库对应着我之前网站上的Tag分类,而且可以做的更细,另外,内容之间的引用依赖,可以自动解析,从而生成一张很好的知识网络图,这是我使用语雀的一个非常重要的原因。就拿我最近还在写的一篇文章来说,有时候一篇文章是很难把一个问题的方方面面都讲清楚的,否则会导致内容太长,而且不易阅读,容易导致读者思路混乱,所以我们经常会把文章分解成主线-支线的方式来组织,例如下面这样。在写一篇文章的过程中,不仅可以分拆支线文章,还可以引用之前写过的文章,从而将整个知识架构串联起来,有了这张图,可以更好的对知识架构进行梳理,同时也可以更好的管理文章。❝还有一点,语雀不会像某些平台那样为了流量利益乱加广告,也不会像某些平台那样为了利益竞争,而禁止引流的二维码❞正是基于这样一个考虑,我把这几年的文章,都迁移到了语雀,目前还在整理中,但是大部分的文章已经梳理完成,后面就是添加引用,建立知识网络了。欢迎大家光临我的主页,持续关注「Android」「Kotlin」「Flutter」——https://www.yuque.com/xuyisheng最后,所有的内容也还会继续同步到我的公众号——「群英传」,毕竟公众号可以很好的利用碎片时间,是上下班路上拓展视野的一个好的工具。向大家推荐下我的网站
2023年2月6日
其他

后新冠时代

自从国家卫健委宣布防控放开之后,所有人都为之一震,原来的【躺平党】慌了,就这么分开了,都不缓一缓吗?原来的【封控党】也慌了,就这么分开了,我们的脸往哪放啊?也许刚放开的时候,大家都还没意识到会出现现在这幅境况,躺平党认为这就是普通感冒,大家都得一次就好了,封控党认为国家抛弃我们了。但实际上,不管是哪种观点,后面的路,都需要我们自己走了。这种猝不及防让所有人都很疑惑,前几天还没有48h核酸不能进饭店,第二天就非必要不做核酸,180°的弯还是漂移过去的,一度导致核酸点人满为患了,之前大家是有需求才做核酸,现在是没事就去做一个,毕竟放开了,万一呢?这可能是当时很多人的真实想法。随着放开之后的第一波疫情来袭,朋友圈里逐渐多了很多【新冠前兆】,有的人,对新冠的第一波症状无尽嘲讽,有的人干脆直接投降了,经过几天的病毒复制,大量在朋友圈分享新冠的人都得出来一个统一的结论,你TM再叫这东西是感冒,我就送你去地狱看看什么是感冒。我本人在得到放开的消息之后,第一时间加重了防护,毕竟家里有老人小孩,能晚点得还是晚点吧。同时也想着趁着放开,将家里人送回老家,毕竟老家独门独栋,应该感染的几率会更小吧?这是最打我脸的一句话,后面我们再说。本来准备12号周一就走,结果当天工位旁边出现一例确诊,导致被回家隔离了三天,期间闭关修炼,每天一次核酸,就担心一旦家人被感染送回老家,会更加危险,期间的核酸各种检测中,出不来结果,而且还有一次抗原阳性,但是单管核酸阴性的结果,经过再三犹豫,还是决定在16号周五把家人送回老家,在之后的一个礼拜,我们和病毒都相安无事,井水不犯河水,直到23号周五,老婆跟我说丈母娘发烧了,而且宝宝早上也开始出现了发烧的症状,所以一刻没有耽搁,当天早上我就收拾东西,回了老家,回家之后,我就做好了全部感染的准备,因为她们在老家已经很小心很小心了,不仅出门戴好口罩消好毒,而且回来也几乎不跟外人接触。但千算万算,也不知道究竟是哪里感染的病毒,一天时间,丈母娘全身酸痛无力,低烧,特别是腰疼,完全不能睡觉,第二天宝宝开始发烧,一直烧到快40°,头一次看见儿子能这么老实的安安静静躺在妈妈怀里,一夜无眠,对宝宝来说,只能喊疼,哼唧哼唧,刚吃完美林也降不了多少,也降不了多久,就又会发烧。第二天,宝宝的精神支柱妈妈也发烧了,我索性也就完全脱离了口罩,好在宝宝在发烧一天一夜后,症状有所减轻,而且也开始愿意下地玩了,虽然后来还有反复烧上去,但好歹美林管够,也还有精神,所以就没太担心,反而是妈妈,一晚上基本上没下过39°,不断创新高,最后发现是因为吃的布洛芬剂量不够导致的,修正问题之后,果然有了改善。今天,原本放弃治疗的我天真的以为可以拖到下周一等妈妈好转了我再阳,结果早上起来就给我啪啪两个大嘴巴子,全身发寒,四肢无力酸痛,刚刚就烧到39.5了,病毒专治不服啊。经过这几天的痛苦,让进入后新冠时代的朋友们一点建议。宝宝​首先,家中宝宝的药一定要不能断,一旦保质期结束就必须有所备份,宝宝发烧,烧的是全家人的心,其次,不必太担心高热惊厥,首次发烧的12h内如果不出现惊厥,后面一定不会出现了,所以前期注意就行。最后,对于不会表达的宝宝来说,慎重尝试各种擦拭物理降温,如果宝宝觉得舒服,那可以降温,如果不能表达,仅仅是降低房间温度和衣服就可以了,另外,宝宝的精神是判断用药的基准,是药三分毒,如果精神好,宁愿再观察。老人​老人也是这次疫情的重灾区,但我们家里的老人反而症状较轻😂,爷爷奶奶只是低烧加全身酸痛,再加上咳嗽,吃过退烧药后,基本上能缓解。丈母娘也是如此,作为最早感染的人,症状就是全身疼,刺骨的疼,低烧咳嗽,三天之后有所改善。但是不能大意,因为有基础病的老年人不管在哪次疫情中,都是最严重的。年轻人​年轻人千万不要吹牛逼,朋友圈已经看见太多了,难道我是天选之子无敌免疫者,话还没说完就是一顿39°,疼的起不来。但是总得来说,年轻人的症状是比较轻的,基本总结为网上说的那些段子,吞刀子,噶腰子,高烧反复,头痛欲裂,四肢无力,无臭无味,甚至还有某男性朋友失去了早上的某些能力,所以,千万不要再说新冠是什么大号感冒了,我就是因为信了你的鬼话,囤了一家人的感冒药,但最后实际上单效的药物,比复方制剂效果更好,所以,布洛芬,对乙酰氨基酚这些东西,应该会是以后家中的常备了。最后,在今天这个全家人进入后新冠疫情时代的日子,希望大家都能尽可能晚点受罪,还在决赛圈的朋友们,加油。
2022年12月25日
其他

Kotlin泛型的型变之路

点击上方蓝字关注我,知识会给你力量之前就写过一篇泛型的文章,但是总觉得写得不够系统,所以最近对泛型又作了些研究,算是对这篇文章的补充了。kotlin修炼指南7之泛型泛型,是为了让「类」、「接口」、「方法」具有更加通用的使用范围而诞生的,举个例子,假如我们不使用泛型,那么一个List中可以装得下任何对象,这么做的问题就在于,在使用时,需要对类型进行检查,不然就会转换异常。所以,我们需要将这种检查前置到编译期,这样在编写代码时,就可以安全的使用不同类型,例如List,我们一看就知道是一个String类型的list,不能放其他类型的元素。在Java中,由于历史原因,它并不存在真泛型,Java所有的泛型都是伪泛型,因为Java在编译期,会执行「泛型擦除」,从而导致在Java字节码中,不存在类型信息(但是类型会被保存在其它地方,这个后面讲)。❝正是由于泛型擦除的问题,你甚至可以通过反射绕开泛型的限制,传递一个非当前泛型限制的对象。❞泛型类型在Java中,通常以一个大写字母来进行标识,我们并不是一定要写「T」来表示泛型,但这是一个约定成俗的表示,类似的约束还有下面这些。通用泛型类型:T,S,U,V集合元素泛型类型:E映射键-值泛型类型:K,V数值泛型类型:N要理解Kotlin的泛型,我们最好首先从Java的泛型来学习,毕竟Kotlin的语法糖太多了,Java会更加白话文一点。首先,Java中的泛型具有「不变性」,也就是说,编译器会认为List和List是两个完全不同的类型,当然,不仅仅是List,比如下面这个例子。open
2022年12月19日
其他

kotlin修炼指南9-Sequence的秘密

3]在Kotlin中,Sequence是Lazy的,这有几个重要的优点。它们保持了操作的自然顺序它们只做最少的操作它们可以是无限的它们不需要在每个步骤中都创建集合让我们来逐一讨论这些优点。Order
2022年11月14日
其他

kotlin修炼指南8—集合中的高阶函数

点击上方蓝字关注我,知识会给你力量Kotlin对集合操作类新增了很多快捷的高阶函数操作,各种操作符让很多开发者傻傻分不清,特别是看一些Kotlin的源码或者是协程的源码,各种眼花缭乱的操作符,让代码完全读不下去,所以,本文将对Kotlin中的集合高阶函数,进行下讲解,降低大家阅读源码的难度,下面看几个用的比较多的高阶函数使用。首先是sumOf,作为一个很方便的求和函数,它可以快速对集合内的某些参数进行sum操作,代码如下所示。val
2022年11月7日
其他

忙里偷闲IdleHandler

点击上方蓝字关注我,知识会给你力量在Android中,Handler是一个使用的非常频繁的东西,输入事件机制和系统状态,都通过Handler来进行流转,而在Handler中,有一个很少被人提起但是却很有用的东西,那就是IdleHandler,它的源码如下。/**
2022年10月31日
其他

货拉拉 Android 模块化路由框架:TheRouter

中,这也是TheRouter允许多个path对应同一个落地页的原因。每当发生页面跳转时,通过跳转时的path,去Map中获取到对应的落地页信息,再正常调用startActivity()即可。三、使用
2022年9月20日
其他

Android-Widget重装上阵

ids)sendBroadcast(updateIntent)这种方式的本质就是发送更新的广播,除此之外,还可以使用AppWidgetManager来直接对Widget进行更新,代码如下。val
2022年9月5日
其他

Android壁纸还是B站玩得花

点击上方蓝字关注我,知识会给你力量设置系统壁纸这个功能,对于应用层App来说,场景其实并不多,但在一些场景的周边活动中,确也是一种提升品牌粘性的方式,就好比某个活动中创建的角色的壁纸美图,这些就可以新增一个设置壁纸的功能。从原始的Android开始,系统就支持设置两种方式的壁纸,一种是静态壁纸,另一种是动态壁纸。静态壁纸静态壁纸没什么好说的,通过系统提供的API一行代码就完事了。最简单代码如下所示。val
2022年8月25日
其他

Flutter混编工程之打通纹理之路

点击上方蓝字关注我,知识会给你力量Flutter的图片系统基于Image的一套架构,但是这东西的性能,实在不敢恭维,感觉还停留在Native开发至少5年前的水平,虽然使用上非常简单,一个Image.network走天下,但是不管是解码性能还是加载速度,抑或是内存占用和缓存逻辑,都远远不如Native的图片库,特别是Glide。虽然Google一直在有计划优化Flutter
2022年8月8日
其他

重走Flutter状态管理之路—Riverpod最终篇

点击上方蓝字关注我,知识会给你力量最后一篇文章,我们在掌握了如何读取状态值,并知道如何根据不同场景选择不同类型的Provider,以及如何对Provider进行搭配使用之后,再来了解一下它的一些其它特性,看看它们是如何帮助我们更好的进行状态管理的。Provider
2022年6月6日
其他

我悟出了公众号取名的套路

点击上方蓝字关注我,知识会给你力量疫情到现在,已经两个多月了,每天看着新闻的报道,看着各大厂的公众号,每天都很充实,好像看了很多东西,但又好像什么也没看,眼瞅着人家的公众号阅读量蹭蹭蹭的上涨,1w+、10w+,再看看自己的公众号零零碎碎的阅读量,我不禁陷入了沉思——为什么我的公众号没人看!我觉得是时候来分析一下了,让我们来看看,如何打造一篇阅读量高的公众号文章标题。作为一个技术公众号,我们来想一个最基本的名字,然后再一步步进行迭代。例如,我准备写一篇文章——《Kotlin协程基础学习》平平淡淡的标题透露着作者菜菜的水平,假如我是一个自认为牛逼的开发者,我才不屑于看这种「基础」文章,仿佛拉低了我的水平,所以,我们修改下标题——《Kotlin协程-核心原理与分析》嗯,有点味道了,看上去有点「资深」的感觉了。但是,这样的标题又会让很多初学者望而却步,所以,为了能够让文章的受众更广,我又进行了迭代——《Kotlin协程-常见面试题分析》一篇文章,让你轻松应付面试,这受众一下子就打开了,看来这个标题也不错。不过,这些标题和那些大厂,以及我发的「广告」相比,还是差了点,我们来看看它们是怎么写的。《吐血推荐!Kotlin协程面试精选》《万字长文!搞定Kotlin协程方方面面》《Kotlin协程,你不得不知的真相》《再不学就废了!Kotlin协程是找工作的敲门砖》《一道Kotlin面试题引发的血案》卧槽,果然有点东西,加了几个「浮夸性」修饰词,瞬间让逼格就起来了,让人很有点击的欲望。类似的,还有——《全网最干货-解读Kotlin协程核心原理》《生动图解-Kotlin协程图文分析》《全网最硬核Kotlin协程分享》这类的文章,点击率和收藏可能非常多,但真正读的,可能没几个,不管文章干不干,写了就是干货,不管图生不生动,加了就生动。当然,有一些确实很有实力的大佬,可以写出这样的文章,但这样的文章,的确是可遇不可求,所以这类文章,通常都是两个极端,要么极好,要么极差。再加上这几年各种自媒体对「35岁」的炒作,现在的广告普遍变成了下面的风格——《搞定Kotlin协程,大厂随便进》《今年三十五,找工作还在被问Kotlin协程》《搞不懂Kotlin协程,要失业了》各种贩卖焦虑的标题,让人真的很焦虑。也许你本来不焦虑,但焦虑的人多了,你也踏上了焦虑的路。除了贩卖焦虑,还有一种贩卖「人设」的套路,通过一些名人效应,来吸引读者的点击,例如——《阿里内部疯传的Kotlin协程学习资料》《三星大牛AvLin老师带你手撕Kotlin协程》《阿里P9面试官最喜欢的Kotlin协程面试题》《看完这篇Kotlin协程分析,吊打腾讯面试官》太牛逼了吧,这么多大佬带我学习,看完这篇文章,我应该可以升P10了,吊打P9。除了这种「大牛系」人设,还有一种「女友系」人设——《手把手教妹子Kotlin协程,结果……》《睡前给妹子讲了Kotlin协程,没想到……》这类的文章,真的是——一言难尽。分析了这么多标题,看来要想提高阅读量,还是挺简单的,不就是:浮夸修饰词、震惊体大而全,全网、全公司、最硬核贩卖焦虑卖人设原理很简单,但是看完自己的分析,我决定给这篇文章起名——《再谈协程》花里胡哨的鬼话学不来,一个好的标题,的确是一篇公众号文章阅读量的基石,但我觉得,更加真诚的标题,才是技术公众号最好的口碑。我也会在公众号中取一些比较有意思的标题,就像现在的几个系列文章:「再谈协程」系列「FlutterComponent最佳实践」系列「Flutter混编之路」系列「Kotlin修炼指南」系列希望能在尽可能的吸引读者的同时,最大限度的用贴近技术的词汇来取名。向大家推荐下我的网站
2022年5月30日
其他

重走Flutter状态管理之路—Riverpod进阶篇

点击上方蓝字关注我,知识会给你力量前面一篇文章,我们了解了如何正确的去读取状态值,这一篇,我们来了解下不同的Provider都有哪些使用场景。这篇文章,我们将真正的深入了解,如何在不同的场景下,选择合适的种类的Provider,以及这些不同类型的Provider,都有哪些作用。不同类型的ProviderProvider有多种类型的变种,可以用于多种不同的使用场景。在所有这些Provider中,有时很难理解何时使用一种Provider类型而不是另一种。使用下面的表格,选择一个适合你想提供给Widget树的Provider。Provider
2022年5月23日
其他

重走Flutter状态管理之路—Riverpod入门篇

点击上方蓝字关注我,知识会给你力量熟悉我的朋友应该都知道,我好几年前写过一个「Flutter状态管理之路」系列,那个时候介绍的是Provider,这也是官方推荐的状态管理工具,但当时没有写完,因为写着写着,觉得有很多地方不尽人意,用着很别扭,所以在写了7篇文章之后,就暂时搁置了。一晃时间过了这么久,Flutter内部依然没有一个能够碾压一切的状态管理框架,GetX可能是,但是我觉得不是,InheritedWidget系的状态管理,才应该是正统的状态管理。最近在留意Provider的后续进展时,意外发现了一个新的库——Riverpod,号称是新一代的状态管理工具,仔细一看,嘿,居然还是Provider的作者,好家伙,这是搬起石头砸自己的脚啊。就像作者所说,Riverpod就是对Provider的重写,可不是吗,字母都没变,就换了个顺序,这名字也是取的博大精深。其实Provider在使用上已经非常不错了,只不过随着Flutter的更加深入,大家对它的需求也就越来越高,特别是对Provider中因为InheritedWidget层次问题导致的异常和BuildContext的使用这些问题诟病很多,而Riverpod,正是在Provider的基础上,探索出了一条心的状态管理之路。大家可以先把官方文档看一看
2022年5月16日
其他

它来了!Flutter3.0发布全解析

点击上方蓝字关注我,知识会给你力量我们在手机、桌面和网络上进行多平台UI开发的历程达到了顶峰。我们很高兴地宣布,作为谷歌I/O主题演讲的一部分,我们今天推出了Flutter
2022年5月12日
其他

kotlin修炼指南7之泛型

点击上方蓝字关注我,知识会给你力量Kotlin在Java的基础上,同样对泛型语法进行了拓展,所以很多Kotlin开发者,看着源码中的一堆in、out和*,感觉非常不知所措。其实,只要了解了Java泛型,那么Kotlin泛型就迎刃而解了。首先,我们来想想,我们为什么需要泛型。泛型是面向对象编程的一个非常重要的方面,它的出现,是多态的核心实现,简单的说,就是可以在不同的对象类型之间,使用相同的代码逻辑,从而实现复用。为了充分了解泛型,以及泛型的实例场景,我们下面来构建一个面向对象的例子。abstract
2022年5月5日
其他

为了看Flutter到底有没有人用我竟然

点击上方蓝字关注我,知识会给你力量Flutter这个东西出来这么久了,到底市场占有率怎么样呢?为了让大家了解这一真实数据,也为了让大家了解当前Flutter在各大App中的使用情况,我今天下载了几百个App,占了手机将近80G空间,就为了得出一个结论——Flutter,到底有没有人用。首先,我在vivo应用市场中,下载了4月11日软件排行榜中的所有App,总计230个,再加上平时用的比较多的一些App,总共270个App,作为我们的统计基数。检测方法,我使用LibChecker来查看App是否有使用Flutter相关的so。https://github.com/zhaobozhen/LibChecker除了使用LibChecker之外,还有其它方案也可以,例如使用shell指令——zipinfo。https://github.com/sugood/apkanalyserApk本质上也是一种压缩包,所以,通过zipinfo指令并进行grep,就可以很方便的获取了,同时,如果配合一下爬虫来爬取应X宝的Apk下载地址,就可以成为一个全自动化的脚本分析工具,这里没这么强的需求,所以就不详细做了。App列表我们来看下,我都下载了多少App。这些App基本上已经覆盖了应用商店各个排行榜里的Top软件,所以应该还是比较具有代表性和说服力的。下面我们就用LibChecker来看下,这些App里面到底有多少使用了Flutter。统计结果已经使用Flutter的App共52个,占全体样本的19.2%,作为参考,统计了下RN相关的App,共有45个,占全体样本的16.6%,可以说,Flutter已经超过RN成为跨平台方案的首选。在52个使用Flutter的App中:腾讯系:QQ邮箱、微信、QQ同步助手、蓝盾、腾讯课堂、QQ浏览器、微视、企业微信、腾讯会议百度系:百度网盘、百度输入法阿里系:优酷视频、哈啰出行、淘特、酷狗直播、阿里1688、学习强国、钉钉、淘宝、闲鱼其它大厂:链家、转转、智联招聘、拍拍贷、哔哩哔哩漫画、网易有道词典、爱奇艺、考拉海购、携程旅行、微博、Soul、艺龙旅行、唯品会、飞猪旅行从上面的数据来看,各大厂都对Flutter有使用,头条系未列出的原因是,目前好像只有头条系大规模使用了Flutter的动态化加载方案,所以原始包内找不到Flutter相关的so,所以未检出(猜测是这样,具体可以请头条系的朋友指出,根据上次头条的分享,内部有90+App在使用Flutter)。❝不过这里要注意的
2022年4月19日
其他

闲言碎语第七期—写给上海疫情

点击上方蓝字关注我,知识会给你力量一转眼,困在家里已经一个月了,这次的上海疫情真是出乎所有人的预料,作为一个技术公众号,我们也不去评判任何政治问题,只是作为一个亲身体验者,谈谈自己最近的感受吧。最早知道疫情扩散时,其实大家都并没有太当回事,毕竟国外的疫情范围,只能用躺平来形容了,所以从在家办公开始,即使知道后面要进行封控,也并没有准备太多的物资,因为那个时候虽然警戒线拉起来了,但是你想出去,保安也不会管你,也就是说,最开始的防疫,实际上是比较形式主义的。我们小区所在镇并不是疫情的重灾区,所以管理相对来说是比较松散的,直到铁丝网拉起来的那一天,所有人才意识到,这次疫情不是那么简单了,这才开始疯狂采购物资,我也是隔离几天后,才找到附件超市老板的电话,采购了一大批物资,这才让温饱有了最基本的保障,再到后来,小区团购的兴起,才让大家对基本生活,有了一定的保障,不至于饿殍满地。作为一个经历者,我来聊聊这次疫情的一些感受。首先是「居委-基层管理者」,面对疫情,除了政府以外,最大的工作承担者,实际上就是这些基层干部,也就是居委会、社区管理者这些人,他们的组织能力和管理能力,直接影响了整个小区的防疫工作,不过很可惜的是,大部分的居委工作人员,组织能力太差,从核酸采集的组织、信息的通报、居民情况的了解这些情况,就可以完全了解一个小区居委的工作能力,不过,没有功劳也有苦劳,小区居委和志愿者们还是很辛苦的,特别是有些居委要分管好几个小区,他们的工作量也是成倍的增长。希望经过这次疫情,居委们能有所警醒,平时就建立起一套完整的管理方案,不仅仅是疫情,因为居委可以说是人民群众和政府之间的桥梁,这个桥梁平时就没建好,怎么能在真正要用的时候承载所需的压力呢?其次谈谈「物资」,对于我们来说,只要有物资保证,让我在家办公一年也没什么问题。所以,这次疫情反映出来的一个很大的问题,就是物资紧缺,大家的基本生活不能保证,也就让大家对封控产生了很大的抵触情绪,网络上很多流出的xx视频,很大一部分都是因为没有物资而产生的。不过从客观上来说,如何保障上海近3000万人的基本生活物资,相信这换成其它任何一个城市,都是很大的挑战。但是挑战归挑战,放低数量级之后,也不是没有成功的案例,深圳就是一个,所以这些可能真的和决策层的领导思路有关,咱也不懂,咱也不敢问。就我所见到的,虽然物资紧,但年轻人基本上还是可以从各种渠道,找到采购的方式,不管是团购还是外卖,还是各种抢单抢菜,虽然生活苦一点,还是能活下去,最可怜的是小区内的老人,如果家里没有年轻人,还真是很难得到这些物资保障,这里其实完全靠居委来保障,为这些老人提供帮助,可真的有多少能做到呢?大部分的老人可能都不会使用微信,更不用说什么抢单了,所以说,这次疫情,家里没老人小孩,没生病,就是最大的幸运了。还好大部分的小区在这次疫情中都建了微信群,邻里之间虽然平时交流不多,但是在这种大是大非面前,都是比较照顾的,大家会分一些物资给那些需要帮助的人,有老人需要药或者物资,大家也会帮忙想办法,所以,人性本善。再来谈谈「躺平
2022年4月17日
其他

FlutterComponent最佳实践之动画那些词儿

点击上方蓝字关注我,知识会给你力量什么是动画,从数学上来说,动画指的是一个属性的变换过程,实际上,就是一个函数,将一个属性值变成另一个属性值的过程。从现实上来说,动画实际上就是将一系列静态的图片,在一定时间内快速切换,从而利用人眼的视觉暂留效应形成动态的画面。对于现代移动设备来说,保持流畅体验的标准是60帧每秒,即每秒要切换60张静态图,这每一帧,在Flutter中被称之为Tick,也叫Vsync,在使用动画的时候,需要mixin的SingleTickerProviderStateMixin,就是Tick的一种,开发者可以监听Animation的每一帧回调,在回调中去刷新UI,从而实现动画的播放。在Flutter中,包含两种动画类型,分别是Tween动画和Physics动画。一个Tween实际上就是定义的属性值的变化区间,而基于Physics的动画,实际上也是一个变化区间,只不过它的变化区间是根据物理引擎计算出来的,更加模拟真实的物理效果。Physics动画的相关类如下所示。https://api.flutter.dev/flutter/animation/AnimationController/animateWith.html
2022年4月11日
其他

FlutterComponent最佳实践之角对齐

点击上方蓝字关注我,知识会给你力量Flutter布局千千万,虽然Box模型相比于原生布局来说,在大部分场景下都是更加方便了,但是有些场景,确实还是ConstraintLayout来的更方便一点,例如下面这个场景:「将不定长度的角标,放置于容器右上角,同时角标中心和容器角顶点对齐」,这其实是一个常见的需求,几乎在UI中的角标场景下都会用到,只不过大部分时候,直接写死一个差不多的偏移量,用Stack就可以实现了,但如果要求特别精准,Flutter的自带Widget就无法满足需求了(通过Key计算的方式就不说了,有点太浪费性能了)。CustomMultiChildLayout我们的想法是,传入两个Widget,一个用来做普通的布局,一个用来做角标,角标中心和布局的右上角订单对齐。所以,先创建CustomMultiChildLayout。Container(
2022年4月6日
其他

闲言碎语—第六期

点击上方蓝字关注我,知识会给你力量好久没有碎碎念了,在家闭关两礼拜了,终于有点时间来思考思考了。最近的计划最近正在着手做一些Flutter相关的工作,顺便整理了一套「Flutter兵法」,看完保证让你在产品面前横着走。做这些东西的目的,实际上是自己在学习的过程中,对技术方案和架构的思考,同时,学习现有的方案,从而归纳出一套最佳实践,不仅对我是一个提高,也对他人在实践过程中,可以起到很好的指导作用,如果能有实践的反馈,也会让我得到反哺。这一系列,可以在公众号菜单中找到,希望能对大家有所帮助。UI组件库我虽然写了很多Android、Flutter的UI上的一些文章,但我基本上不会去做一些开源的所谓的「UI组件库」。因为对于在公司的开发者来说,没有哪家公司的UI库可以完美的用在另一家公司上(当然,除了一些小的初创公司,不在意UI风格,只是功能实现),为什么呢,因为一个App的设计风格,往往是跟公司挂钩的,从配色、组件、交互上,大公司都形成了一套自己的风格体系,所以,如果要做一套开源的组件库,那么势必需要增加茫茫多的配置、各种颜色、形状、阴影等等等,这些东西一旦形成配置,就会无限制的增加组件的复杂度,即使这些东西,在一个公司内,可能是一次性的设置,但是要做成通用的UI组件库,那就需要增加很多无聊的配置。所以,我对于「UI组件库」的看法就是——在公司内部设计风格统一的基础上,实现一个「公司级别的UI组件库」,这样一来,其实组件的风格基本就固定了,也不用太多的配置,也便于维护,更重要的是,它不冗余,没有那些花里胡哨的配置,也没有无用的功能。而对于这样一套「UI组件库」,也就没有开源的必要了,我做的事情,便是授之以渔,学会了组件库的设计方法,实现一套公司级别的组件库,并不是什么难事。救火队员曾经有一个段子:魏文侯问扁鹊:“你兄弟三人,哪个软件开发水平最高?”扁鹊说:“大哥最好,二哥其次,我最差。”
2022年3月31日
其他

天下大势 封久必核 核久必封

上海这两天「热闹」了,经过了2+2+2+2+2……的隔离后,上海发布了疫情的最新防控策略。一瞬间,上海变成了这样。上海其实并没有封城,也不会封城。疫情虽然严重,但大家还是要保持积极乐观的心态。网上的这些段子,实际上也是缓解疫情压力的一种方式,大家放松心态,积极配合防疫工作,相信很快就能恢复正常的生活节奏了。相信大家写段子也是为了让在家隔离的心情放松一点,但是玩笑归玩笑,大家还是要积极配合防疫政策,用自己的行动,来迎接即将到来的春天。素材来源于网络,侵删上海加油,春天就要来了
2022年3月29日
其他

FlutterComponent最佳实践之沉浸式

点击上方蓝字关注我,知识会给你力量沉浸式状态栏,在Android开发中是一个比较麻烦的地方,因为不同的机型和版本兼容问题太多了,API变化也快,但是到了Flutter,一切问题都解决了,因为整个区域都是Skia绘制的,要什么都行,随便来。❝以上问题只针对Android,因为iOS没这问题。。。默认就是沉浸式,只能说,Google的设计师,真是不懂行情。❞我们来看下iOS的效果。image-20220317110251692没什么好适配的,干就完了了。状态栏沉浸式再来看看Android。image-20220317110528204这个状态栏,为什么国内的设计师都想干掉它的颜色呢。首先,我们来修改状态栏的颜色,Flutter提供了SystemChrome.setSystemUIOverlayStyle来修改状态栏和底部导航栏的样式修改,借助它,我们可以很方便的干掉状态栏的默认颜色。SystemChrome.setSystemUIOverlayStyle(
2022年3月24日
其他

FlutterComponent最佳实践之取色我来实现

点击上方蓝字关注我,知识会给你力量构建个性化的UI是非常酷的。你的应用程序不需要对每个人都是一样的。一个轻松定制你的应用程序的方法是,从客户资料/封面照片中提取调色板。它是这样做的。首先,我们从一个网址上加载图片到byte
2022年3月23日
其他

FlutterComponent最佳实践之TabbarIndicator

点击上方蓝字关注我,知识会给你力量TabBar是UI中非常常用的一个组件,Flutter提供的TabBar几乎可以满足我们大部分的业务需求,而且实现非常简单,我们可以仅用几行代码,就完成一个Tab滑动效果。关于TabBar的基本使用,我这里就不讲解了,不熟悉的朋友可以去Dojo里面好好体验一下。下面我们针对TabBar在平时的开发中遇到的一些问题,来看下如何解决。抖动问题首先,我们来看下TabBar的抖动问题,这个问题发生在我们设置labelStyle和unselectedLabelStyle的字体大小不一致时,这个需求其实也很常见,当我们选中一个Tab时,当然希望选中的标题能够放大,突出一些,但是Flutter的TabBar居然会在滑动过程中抖动,开始以为是Debug包的问题,后来发现Release也一样。Flutter的Issue中,其实已经有这样的问题了,地址如下:https://github.com/flutter/flutter/issues/24505不过到目前为止,这个问题也没修复,可能在老外的设计中,重来没有这种设计吧。不过Issue中也提到了很多方案来修复这个问题,其中比较好的一个方案,就是通过修改源码来实现,在TabBar源码的_TabStyle的build函数中,将实现改为下面的方案。///根据前后字体大小计算缩放倍率final
2022年3月17日
其他

Flutter混编工程之Font桥接

点击上方蓝字关注我,知识会给你力量在混编开发中,我们经常遇到要全局替换当前字体的需求,在Native开发中,我们通常会加载Asset或者下载的字体文件,那么在Flutter中,如何直接使用Native的字体文件呢?毕竟大部分的字体文件都毕竟大,特别是一些字体还有加密策略,如果在Flutter中再创建一份字体文件,既浪费空间,而且也是一种重复代码,所以,我们需要在Flutter端,获取Native的字体文件。在Flutter中,系统给我们提供了FontLoader,来动态加载字体,与前面的做法一样,我们创建一个Native接口,来获取Native传来的Byte数据流,并借助FontLoader来加载字体。FontLoader加载字体数据为了提高传输的效率,我们使用BasicMessageChannel来作为Channel的实现,这些在我们讲解Flutter与Native的通信机制中,都已经演示过了,我们直接拿来Google的Demo代码,修改下需要的内容,将FontLoader引入,代码如下所示。import
2022年3月16日
其他

Flutter布局指南之Box套盒子

),)从而可以让内部的Container按照自身尺寸进行布局。image-20220227134310007更加灵活一点,我们还可以选择保留某一方向上的约束:constrainedAxis:
2022年3月13日
其他

Flutter布局指南之谁动了我的Key

点击上方蓝字关注我,知识会给你力量Key用来干嘛Flutter中的Key,一直都是作为一个可选参数在很多Widget中出现,那么它到底有什么用,它到底怎么用,本篇文章将带你从头到尾,好好理解下,Flutter中的Key。我们首先来看下面这个Demo:Column(
2022年3月8日
其他

FlutterComponent最佳实践之Shadow怎么就这么简单

点击上方蓝字关注我,知识会给你力量设计三件宝,模糊阴影和圆角。这些在原生开发中被设计摧残N年的东西,在Flutter中,居然是轻而易举的实现。添加Shadow在Flutter中,Container可以使用BoxDecoration来添加Shadow,如果是单独的Widget,可以通过DecoratedBox来添加阴影。下面我们以Container为例,演示Flutter的Shadow实现。原始效果如图所示。image-20220224151814634child:
2022年3月3日