使用 Linux 作为日用系统已经好有几年了,有时遇到一些不方便的地方就时常会打算自己写个插件或者软件什么的,于是顺利成章地就会想学学相关的东西。
之前我尝试学习开发 Gnome 插件时,虽然配置用 TypeScript 开发项目很顺利,但是到了实现功能时就感到有些困难。或许是因为 Gnome 团队没有足够的人手来同时维护 API 文档和教程,我经常想实现个功能却找不到对应的教程,自动生成的 API 文档则看得我摸不着头脑。后面我灵机一动,把 Gnome 团队 GitLab 上的 gnome-shell
项目克隆到了本地,最后终于在代码里找到了应该如何实现我想要的效果。
后来某一天我在逛 GitHub 时偶然发现一个软件居然贴心地提供了 Linux 版本,稍微看了一下发现是用 Flutter 开发的,于是就萌生了学学 Flutter 的想法。当然我的行动力没这么强,正式学习 Flutter 已经是很久之后的事了。后面也了解到了 Kotlin Multiplatform,使用了下感觉在 Linux 桌面端的效果其实并不比 Flutter 差,基于 Composable 开发 UI 也比 Flutter 支持的方式舒服得多,甚至 Kotlin Multiplatform 在桌面端还能蹭蹭 JVM 的生态,可以说是非常舒适了。
因此,Masiro 这个练手项目的初版其实是用 Kotlin Multiplatform 开发的。
使用 Kotlin Multiplatform 搭建项目的过程比较顺利,路由、依赖注入、状态管理之类的配置都没啥问题,唯一卡住我的地方是 CloudFlare 的人机验证。不管是 Flutter 还是 Kotlin Multiplatform 在 Linux 平台上 WebView 的支持都不太好,因此不能直接使用 WebView 来通过检测,只能另寻它法。后面尝试使用了 Selenium + WebDriver + Chrome 的方案,但是还是被 CloudFlare 检测出来我是程序了。想办法研究了下 Puppeteer 绕过 CloudFlare 的 Stealth 插件,启用了 Chrome 的 --disable-blink-features=AutomationControlled
参数,再把里面的 JavaScript 伪装脚本扒了下来让我的 WebDriver 执行,结果还是被检测出来了。
只恨自己不是写爬虫的大佬,面对 CloudFlare 的这个黑盒,不知道自己究竟是哪里露出了马脚。然而 Flutter 官方仓库的 Puppeteer 库就能悄无声息地通过 CloudFlare 的检测,不知道我究竟是忽略了什么地方。好在项目才刚搭建完成,切换成 Flutter 开发也没什么负担,后面就自然而然地转向 Flutter 了。
之前虽然对 Flutter 早有耳闻,但毕竟没有实际写过代码,只能说了解有限。实际上手之后,感觉和引入 Hook 之前的 React 挺像的,基础的使用方式学习起来几乎没有什么成本。顺带一提,Flutter 也有支持使用 Hook 的第三方库,但是考虑到毕竟不是官方所支持的,担心遇到疑难杂症,最后还是没有使用。
再后面就是功能的具体实现了,这部分比较琐碎,就不赘述了。
目前使用下来,Flutter 让我感到最惊艳的地方还是它对 Web 端的支持,基于 Canvas 绘制的 UI 实现了和桌面端一致的视觉效果。每次查询 Flutter 组件的文档时,网页上即时呈现的可编辑的 Demo 总能帮到我。不得不说 Google 提供的 Flutter 文档真的是很丰富,大概这就是有钱的好处吧。
絮絮叨叨地说了很多。目前感觉自己还得再深入了解下 Flutter 的绘制原理,这个就通过继续看 《Flutter 实战·第二版》 来学习吧。至于 Kotlin Multiplatform 的学习计划估计得延续到后面了,下次有机会再拿来练练手。