Daily Digest

每日新聞摘要

2026年07月04日

今日總結

內容會跟隨語言切換。

📝 今日焦點:Habit Arc 以自動化與回饋取代 streak,並維持資料只存本機;Kotlin Multiplatform 也持續擴展到共用 DI、網路層與整體 UI。 🔧 效能最佳化:Kotlin 協程不會自動把阻塞變非阻塞,仍需正確 dispatcher 或真正非同步 API;OpenHearing 以純 Kotlin 實作 DSP 與 limiter,兼顧即時處理與可測試性。 🏗 架構設計:Compose 的核心在 Composition、Layout、Drawing,且進階副作用可用來安全橋接狀態與 coroutine;FCM、MVC/MVP/MVVM/MVI、Koin 與 Ktor 文章則共同強調跨平台與現代 Android 架構的一致性。 ✅ 測試與品質:Jackson Kotlin Module 啟用 NullIsSameAsDefault 可避免空列表反序列化錯誤;OpenHearing 以 JVM 測試驗證限制,並用 no Internet 權限強化隱私承諾。

01

I stopped faking progress with a counter and measured automaticity instead

Dev.to Kotlin 作者:Mill1995 發布:07-04 13:31

我不再用計數器假裝進度,而是改為衡量自動化程度

連勝紀錄衡量的是服從;只有自動化,才會在動機消失後仍然留下來。

重點摘要

連勝計數器會在一次中斷後崩潰,無法反映真實習慣。
文章主張以自動化程度取代天數,並引用相關研究與量表。
Habit Arc 採用階段、成長分數與本機儲存,強調可持續與隱私。

這篇文章是 Habit Arc 兩篇系列文的第一篇,重點在理念與科學基礎。作者認為,習慣養成不該靠容易失真的連勝計數,而應衡量行為是否逐漸自動化;文中引用 SRBAI 與相關研究,指出習慣形成時間差異很大,沒有通用天數。為此,Habit Arc 以階段、成長分數與每週自評取代斷裂式的 streak,並把失誤視為回饋而非失敗。應用程式也避免自動標記錯誤、支援不同類型習慣,且所有資料都只存在手機上。

02

Koin in Kotlin Multiplatform: One DI Graph to Rule Both Platforms

Medium Kotlin 作者:Shubham Tiwari 發布:07-04 08:52

Kotlin Multiplatform 中的 Koin:一套 DI 圖譜同時支援兩個平台

建立一個可在 Android 與 iOS 間無縫運作、且不需要程式碼生成的依賴注入圖譜。

重點摘要

Koin 被用於 Kotlin Multiplatform 的依賴注入
單一 DI 圖譜可同時服務 Android 與 iOS
此方法避免了程式碼生成

本文介紹如何在 Kotlin Multiplatform 中使用 Koin,建立一套可同時在 Android 與 iOS 運作的依賴注入圖譜。重點在於以更簡潔的方式維持跨平台的依賴管理一致性,同時不必依賴程式碼生成。作者強調,這種做法有助於多平台專案減少重複設定,並提升架構維護性與整體開發效率。

03

Ktor in Kotlin Multiplatform: The Android + iOS Networking Deep Dive I Wish I Had Earlier

Medium Kotlin 作者:Shubham Tiwari 發布:07-04 09:30

Kotlin Multiplatform 中的 Ktor:Android 與 iOS 網路通訊深度解析

一個 HTTP 客戶端,兩個平台,零重複的網路程式碼。

重點摘要

Android 與 iOS 共用單一 HTTP 客戶端
以 Kotlin Multiplatform 減少重複的網路程式碼
重點在 Ktor 的跨平台網路架構

這篇文章介紹 Kotlin Multiplatform 中的 Ktor,目標是讓 Android 與 iOS 共用同一個 HTTP client,避免重複撰寫網路程式碼。從目前可見內容來看,作者強調的是以單一網路層整合跨平台開發,讓行動應用在維護與擴充上更一致,也更有效率。

04

Part 1: Under the Hood: Mastering the Jetpack Compose 3-Phase Layout Pipeline

Medium Kotlin 作者:Android Expert 發布:07-04 09:40

第 1 部分:深入原理:掌握 Jetpack Compose 的三階段版面配置流程

不要再把 Compose 當成更快的 XML 版本。

重點摘要

聚焦 Compose 背後的內部運作機制。
介紹 Composition、Layout 與 Drawing 三個階段。
強調理解 Compose 原理的重要性。

本文主張,不應把 Jetpack Compose 視為更快的 XML 替代品,而應深入理解其背後的內部運作機制。文章以 Composition、Layout、Drawing 這三個核心階段為主軸,引導讀者掌握 Compose 如何完成 UI 呈現,並強調只有真正理解這些流程,才能更有效地運用這套工具。

05

Share Your Entire UI Layer Across Android, iOS, and Desktop — A Real iOS Walkthrough

Medium Kotlin 作者:Reza Ramesh 發布:07-04 11:31

在 Android、iOS 與桌面端共享整個 UI 層——一個真實的 iOS 實作導覽

六年來,Kotlin Multiplatform 的宣傳話術前面總帶著一個但書。

重點摘要

Kotlin Multiplatform 長期以共享商業邏輯為主要賣點。
文章強調的焦點是連整個 UI 層都能共享。
內容以真實的 iOS 導覽作為實作示範。

近六年來,Kotlin Multiplatform 的訴求多半帶著但書:它擅長在 Android 與 iOS 之間共享商業邏輯,但還不是完整共享應用體驗。這篇文章則把重點推進到更大的目標——讓整個 UI 層也能跨 Android、iOS 與桌面端共用。作者以真實的 iOS 實作導覽為例,呈現一條超越傳統跨平台限制的可行路徑,並凸顯共享程式碼更完整落地的可能性。

06

[Android Development] FCM Deep Dive: Your Android App Is Not Always Running

Medium Kotlin 作者:tahn98 發布:07-04 12:05

[Android 開發] FCM 深入解析:你的 Android App 不會一直在執行

Firebase Cloud Messaging 最常見的一個誤解是:

重點摘要

說明對 Firebase Cloud Messaging 的常見誤解
強調 Android App 並不會永遠保持執行
引出 FCM 在 Android 上的運作細節

本文先點出對 Firebase Cloud Messaging 的常見誤解:許多開發者以為 Android App 會一直在背景執行,因此訊息可以隨時直接送達。實際上,App 可能已停止、進入背景或被系統終止,訊息的接收與處理取決於 FCM 與 Android 系統的互動方式。文章以此為起點,帶出對 FCM 行為與 Android 設計影響的深入探討。

07

Android Architecture Design Patterns: MVC, MVP, MVVM & MVI (2026 Guide)

Medium Kotlin 作者:Halil Özel 發布:07-04 12:06

Android 架構設計模式:MVC、MVP、MVVM 與 MVI(2026 指南)

實用比較 Android 最重要的架構模式、各自的適用時機,以及為何 MVVM 與 MVI 持續主導開發實務。

重點摘要

比較 Android 的 MVC、MVP、MVVM、MVI
說明各架構模式的適用時機
指出 MVVM 與 MVI 仍是主流選擇

本文以實用角度比較 Android 幾種重要的架構設計模式:MVC、MVP、MVVM 與 MVI,並說明各模式的核心用途與適用時機。文章聚焦於它們在 Android 應用程式中的分工方式與差異,同時指出在現代 Android 開發中,MVVM 與 MVI 之所以持續占主導地位,與更清楚的狀態管理及較佳的可維護性密切相關。

08

Coroutines Don’t Make Blocking Code Non-Blocking

Medium Kotlin 作者:Mohammad Hasan Mahdavi 發布:07-04 13:59

協程不會讓阻塞程式碼變成非阻塞

把程式放進協程中,並不會自動讓它變成非同步。

重點摘要

協程本身不會改變阻塞式 API 的行為。
若底層工作仍會阻塞,執行緒依然會被占用。
誤解協程可能導致不佳的並行設計。

本文指出 Kotlin 協程常見的誤解:把程式包進協程,並不代表原本的阻塞操作會自動變成非阻塞。若底層呼叫本質上仍是阻塞式,它依然會占住執行緒,除非將工作轉移到適當的 dispatcher,或改用真正的非同步 API。重點在於,協程是並行工具,而不是非阻塞 I/O 的替代品。

09

Apple locked hearing assistance inside AirPods. So I built an open-source version for any earbuds.

Dev.to Kotlin 作者:Arun KT 發布:07-04 06:16

Apple 把聽力輔助鎖在 AirPods 裡,所以我做了任何耳機都能用的開源版本

OpenHearing 是一款免費的 GPLv3 Android App,能把一般耳機變成聽力輔助工具。

重點摘要

以純 Kotlin 實作安全關鍵的音訊處理流程
將單聲道麥克風輸入分成左右耳獨立處理
不申請 Internet 權限,連資料傳輸都無法發生

Apple 的 AirPods Pro 聽力功能啟發了 OpenHearing:一款開源 Android App,讓一般耳機也能提供類似的聽力輔助流程。它先以純音測試做聽力檢查,再依左右耳結果建立各自的增益曲線,並即時放大聲音,無需 root 或特殊硬體。作者特別強調安全設計,整條 DSP 鏈以純 Kotlin 實作,最後再由 limiter 把關,所有限制都可用 JVM 測試驗證。OpenHearing 也把單聲道麥克風複製成左右耳獨立處理,並刻意不申請 Internet 權限,讓隱私承諾可被系統直接驗證。此專案目前仍是 alpha,尚未在真實硬體上完成驗證。

10

How to deal with empty lists that defaults to null in Jackson and Kotlin

Dev.to Kotlin 作者:Isaias Velasquez 發布:07-04 07:04

如何處理 Jackson 與 Kotlin 中預設為 null 的空列表

最簡單的做法,是手動宣告 Jackson Kotlin Module,並啟用 NullIsSameAsDefault。

重點摘要

Kotlin data class 的空列表在反序列化時可能引發 null 斷言錯誤。
改用 KotlinModule.Builder(),並將 KotlinFeature.NullIsSameAsDefault 設為 true。
需要加入 jackson-module-kotlin 2.17+,再手動註冊模組。

本文說明在使用 Jackson 反序列化 Kotlin data class 時,若列表欄位收到空值,可能會因為 null 斷言而出錯。作者提供的解法是不要直接使用 ObjectMapper.registerKotlinModule(),而是手動建立 Jackson Kotlin Module,並啟用 KotlinFeature.NullIsSameAsDefault。如此一來,Jackson 會把 null 視為預設值,讓空列表欄位能正常反序列化,不再拋出錯誤。文章也補充了所需依賴為 jackson-module-kotlin 2.17+。

11

Jetpack Compose Advanced Side-Effects: Mastering Coroutine Bridges & State Synchronization

Medium Kotlin 作者:Android Expert 發布:07-04 05:33

Jetpack Compose 進階副作用:掌握 Coroutine 橋接與狀態同步

深入探討 produceState、snapshotFlow、rememberCoroutineScope,以及如何避免沉默的 stale reference bug。

重點摘要

介紹 Jetpack Compose 進階副作用 API
說明 produceState、snapshotFlow 與 rememberCoroutineScope
分析如何避免 silent stale reference bug

本文深入解析 Jetpack Compose 的進階副作用機制,聚焦於如何安全且可預期地將 coroutine 與 Compose 狀態橋接起來。內容說明 produceState、snapshotFlow 與 rememberCoroutineScope 的用途,並展示它們如何協助同步 UI 狀態與非同步工作。文章同時提醒讀者注意 silent stale reference bug,這類問題常因捕捉到過期值而悄悄出現,因此理解這些模式對撰寫穩定可靠的 Compose 程式碼非常重要。