Daily Digest

每日新聞摘要

2026年03月17日

01

I Had 3 Abandoned Apps, Then Kotlin Pulled Me Back In

Dev.to Kotlin 作者:freerave 發布:03-17 11:00

我有三個被棄置的應用,然後 Kotlin 把我拉回來了

某個安靜的晚上我打開 Android Studio,看著 Kotlin 語法,心想:「等等……這其實很有趣。」

重點摘要

Kotlin 與 Compose 讓作者重燃開發熱情並推出 DotReminder v0.0.5
功能包含 Gemini AI、指紋/生物辨識、兩步驗證與即時 Firestore 會話
透過 AGP 9.0/KSP 遷移與移除影片背景,顯著縮短建置與減少 APK 大小

作者描述原本放置三個 Android 專案後,因為某晚對 Kotlin 的興趣再次投入,完成 DotReminder v0.0.5。開發初期以玩樂為主,嘗試 Jetpack Compose、Hilt、Firebase,以及支援自然語言的 Gemini 聊天、地理圍欄提醒、多主題、指紋認證、2FA 與桌面小工具。v0.0.3 將模擬的 Active Sessions 換成 Firestore 實時資料,並修正因使用 ComponentActivity 而導致 BiometricPrompt 崩潰的問題;同時補上 sessions 子集合的安全規則。升級到 AGP 9.0 時改用 KSP 減少建置時間;移除 74MB 影片背景改用 Compose 漸層,將應用從 95MB 縮至 20.5MB。最後升級 Gemini 模型並以 JSON 提取器將自然語言轉為結構化提醒,未來計畫包括正式的密碼變更、日曆整合與擴展 AI 功能。作者把被棄置的專案視為學習成本,最終匯聚成現在的成果。

02

Read-Write and Read-Only Transaction Routing With Spring

Baeldung 作者:Ulisses Lima 發布:03-17 13:01

在 Spring 中以交易路由讀寫與唯讀資料庫

使用 AbstractRoutingDataSource 並根據 @Transactional 的 readOnly 標記,自動將讀取導向複製庫、寫入導向主庫。

重點摘要

以交易的 readOnly 屬性決定要使用主庫或複製庫
在 determineCurrentLookupKey() 使用 TransactionSynchronizationManager 判斷是否為唯讀交易
使用 LazyConnectionDataSourceProxy 延遲連線以正確套用 readOnly 標記

示範在 Spring 中以交易為單位路由資料庫,將寫操作導向主庫、讀操作導向複製庫。實作由 AbstractRoutingDataSource 判定交易是否為 readOnly(透過 TransactionSynchronizationManager),並以 LazyConnectionDataSourceProxy 延遲連線以正確套用 readOnly 標記。範例包含 H2 資料源設定,手動配置 EntityManagerFactory 與 JpaTransactionManager,並以未同步的複製庫進行整合測試以驗證路由行為。文章同時提醒實務上需注意複寫延遲、巢狀交易的傳播行為,以及多副本或負載平衡等擴充策略。

03

Using Kotlin Multiplatform for Cross-Platform Android Apps

Medium Kotlin 作者:Gulshan Yadav 發布:03-17 08:46

使用 Kotlin Multiplatform 建構跨平台 Android 與 iOS 應用

客戶要求在 Android 與 iOS 上提供相同功能並同步釋出。

重點摘要

客戶要求 Android 與 iOS 提供相同應用
考量以 Kotlin Multiplatform 共用程式碼以減少重複工作
文章說明其優點與實務上需注意的事項

文章從一位客戶要求 Android 與 iOS 提供相同功能且同步釋出的需求出發,探討以 Kotlin Multiplatform(KMP)作為解法,透過共用商業邏輯與核心元件來降低重複開發。文中說明 KMP 可以提升程式碼重用率、加快兩端功能一致性,並可能提高開發效率;同時也提醒實務面需考量的平台差異,如 UI 必須維持原生體驗、與原生 API 的整合、跨目標的測試策略以及建置工具鏈的管理。本文適合正在評估跨平台方案、期望在多平台上達到相同功能與版本時程的團隊閱讀。

04

Dart Switch Statement — Everything a Flutter Developer Should Know

Medium Kotlin 作者:Waseem Abbas 發布:03-17 10:28

Dart 的 switch 語句——每位 Flutter 開發者應該知道的事

如果你是 Flutter 開發者(尤其是從 Android/Kotlin 來的),理解 Dart 的 switch 至關重要。

重點摘要

說明 Dart switch 的語法與行為
比較與 Android/Kotlin 的差異與常見陷阱
提供在 enum 與常見值型別上使用的實作建議

本文為 Flutter 開發者(尤其是從 Android/Kotlin 轉來者)整理 Dart 的 switch 語句,說明其語法與行為差異。文章解釋 case 標籤的運作、預設分支與避免其他語言常見的 fall-through 問題,並示範在 enum 與常見值型別上的使用情境。透過比較 Kotlin/Android 的習慣寫法,作者指出在跨平台移植或學習時易犯的錯誤,並提供實用建議以撰寫更清晰、可維護的條件邏輯,幫助開發者在 Flutter 中更有效率地運用 Dart 的 switch。

05

How LiveData Works Internally in Android

Medium Kotlin 作者:Anand Gaur 發布:03-17 10:30

深入解析 Android 中 LiveData 的內部運作

在 Android 開發中,一個反覆出現的問題是:如何管理 UI 的生命週期與資料同步。

重點摘要

解決 UI 生命週期與資料同步的常見問題
說明 LiveData 的生命週期感知觀察者模型
描述安全且同步地傳遞資料的內部機制

Anand Gaur 的文章探討 LiveData 如何解決 Android 開發中反覆出現的問題:管理 UI 生命週期與資料同步。作者說明為何需要生命週期感知的可觀察資料容器,LiveData 如何將觀察者綁定至 LifecycleOwner 以避免記憶體外洩與異常,並僅將更新傳遞給處於活動狀態的觀察者。文中也概述 LiveData 的內部運作,包括觀察者註冊、活動/非活動狀態追蹤,以及在正確執行緒上安全傳送值的機制,說明它如何簡化 UI 與資料的同步流程,提高應用穩定性與正確性。完整內容請見 Medium。

06

Mastering — by lazy in Kotlin

Medium Kotlin 作者:Amitdogra 發布:03-17 10:53

掌握 Kotlin 的 'by lazy'

深入探討延遲初始化、委派、執行緒安全模式,以及 Kotlin 在底層如何實作 'by lazy'。

重點摘要

說明延遲初始化與委派模式
比較不同的執行緒安全模式對並行行為的影響
解析 Kotlin 在底層實作 'by lazy' 的方式

本文深入探討 Kotlin 的 'by lazy' 機制,涵蓋延遲初始化、委派模式,以及影響多執行緒行為的執行緒安全模式,並解析 Kotlin 在底層如何實作該機制。文章說明延遲計算如何在第一次使用時才執行,並討論不同安全模式在同步與效能間的取捨,同時提醒開發者在選用 lazy 策略時應考量的情境與潛在風險,協助實務上正確且有效地運用 'by lazy'。

07

I Had 3 Abandoned Apps, Then Kotlin Pulled Me Back In

Medium Kotlin 作者:freerave 發布:03-17 11:01

我有三個被棄置的應用程式,然後 Kotlin 把我拉回來

三個應用、三個點子、三次興奮都最後被丟進「以後再完成」的堆裡。

重點摘要

截圖顯示三個已被放棄的應用專案。
每個點子的初期熱情最終都變成「以後再說」的堆疊。
Kotlin 重新喚起作者的興趣,讓作者回頭繼續開發。

文章以一張截圖為起點:三個不同的應用專案,皆曾帶來興奮,但最後都被擱置,成為「以後再完成」的待辦。作者描述在這些專案沉睡一段時間後,Kotlin 意外地把他拉回來,重新點燃繼續開發的動力。全文並未深入技術細節,而是聚焦在心理層面的轉變——開發工具或語言有時能成為催化劑,使人重新審視並回到被放棄的想法上。這是一則關於創作動力流失與被重新喚起的簡短反思。

08

Kotlin Fundamentals Part 14 — Extension Functions — Kotlin’s Secret Weapon

Medium Kotlin 作者:Kishor Ramani 發布:03-17 11:54

Kotlin 基礎 第14 篇 — 擴充函式 — Kotlin 的秘密武器

想在不使用繼承的情況下為任何類別新增函式?擴充函式就像魔法一樣!

重點摘要

在不使用繼承的情況下為類別新增函式
簡化程式碼並提升可讀性
Kotlin 常被視為的強大「秘密武器」

本篇為 Kotlin 基礎系列之一,介紹擴充函式(extension functions):可在不使用繼承的情況下為任何類別新增函式。藉由宣告擴充函式,可以像呼叫成員方法一樣使用新增功能,簡化 API、減少樣板程式碼並提升可讀性與表達力。擴充函式定義簡潔、整合 Kotlin 型別系統,方便改造第三方類別、組織工具函式與改善程式結構。許多 Kotlin 開發者視其為「秘密武器」,因為它能在不建立子類別的前提下延伸行為,本文強調此概念的強大並建議閱讀者參考範例與實際案例以有效運用。

09

Kotlin Fundamentals Part 15 — Function Overloading — Same Name, Different Power! ⚡

Medium Kotlin 作者:Kishor Ramani 發布:03-17 11:54

Kotlin 基礎教學 第15篇 — 函式重載:相同名稱,不同能量!

一個函式名稱,多種實作 — 這就是函式重載。

重點摘要

以相同函式名稱提供不同參數或型別的多種實作
由編譯器在編譯時依參數選擇對應的重載版本
可提升 API 可讀性,但需避免模糊或過多的重載

本篇屬於 Kotlin Fundamentals 系列,簡介函式重載(function overloading)概念:以相同函式名稱提供多種實作,透過不同參數簽名或型別由編譯器在編譯時選擇對應版本。文章說明此技巧如何提升 API 可讀性與使用便利,同時提醒設計時應避免過多或模糊的重載,以免導致歧義與可維護性問題。實作要點包含選擇明確的參數簽名、適度使用命名參數或預設值,以及在必要時採用不同名稱以保持清晰。總結:函式重載是 Kotlin 中靈活且常用的語言特性,可在便利性與清晰度間取得平衡。

10

O que é TDD?

Medium Kotlin 作者:Leonardo Paulino 發布:03-17 12:09

什麼是 TDD?

TDD 是 Test Driven Development(測試驅動開發)的縮寫,葡萄牙文為 Desenvolvimento Orientado a Testes。

重點摘要

TDD 為 Test Driven Development 的縮寫
葡萄牙文名稱:Desenvolvimento Orientado a Testes
意指以測試為導向的開發方式

本文簡短說明 TDD 為 Test Driven Development 的縮寫,並給出其葡萄牙文對應 Desenvolvimento Orientado a Testes。名稱本身即揭示核心概念:開發流程以測試為導向,測試在設計與驗證中扮演主導角色。雖然原文內容簡潔,但可由字面理解 TDD 指的是一種軟體開發方法,透過測試來驅動程式設計與確認行為是否符合預期,進而協助開發者在撰寫與修改程式碼時有更明確的依據。此條目主要提供術語定義與翻譯,強調測試導向的本質。

11

Stop Using READ_CONTACTS: A Modern Android Contact Picker Guide

Medium Kotlin 作者:Sivavishnu 發布:03-17 14:28

停止使用 READ_CONTACTS:現代 Android 聯絡人選取器指南

如何遷移到零權限策略、提升使用者信任,並為系統聯絡人選取器撰寫生產級的 Kotlin 程式碼。

重點摘要

從 READ_CONTACTS 遷移到零權限策略
使用系統聯絡人選取器以提升隱私與信任
採用生產級 Kotlin 實作與良好設計模式

本文說明如何不再使用 READ_CONTACTS 權限,而改採零權限策略,透過系統聯絡人選取器實作聯絡人選擇。文章說明此做法如何提升使用者隱私與信任,並提供將現有應用遷移到安全、可維護的 Kotlin 量產實作的實務建議。內容涵蓋遷移考量、常見陷阱與設計模式,強調減少權限面向、利用平台介面進行聯絡人選取,與撰寫適合生產環境的穩健 Kotlin 程式。目標讀者為 Android 開發者,能藉本指南獲得步驟性建議與範例導向的實作方向。

12

Mastering Jetpack Compose Lifecycle in Fragments

Medium Kotlin 作者:Sivavishnu 發布:03-17 03:54

掌握 Jetpack Compose 在 Fragment 的生命週期

實務指南:在混合型 Android 應用中處理狀態、組合策略與 Compose 與 Fragment 的生命週期交互。

重點摘要

在 Fragment 生命週期中管理 Compose 狀態
為混合 View/Compose 應用選擇組合策略
處理生命週期交互以避免記憶體洩漏與錯誤重組

本文為實務指南,說明如何在 Android 的 Fragment 中使用 Jetpack Compose,重點在於狀態管理、組合策略,以及在混合應用中處理 Compose 與 Fragment 的生命週期交互。文章指出在 Fragment 生命週期內建立 Compose 時常見的陷阱,說明如何將狀態綁定於片段或更高層的生命週期、比較在 view 生命週期內組合與建立長期存在的 Compose 根節點等做法。作者強調穩定的狀態處理、預防記憶體洩漏與在生命週期變化時維持正確的重組行為,適合逐步遷移或在既有 Fragment 程式碼中安全整合 Compose 的開發者閱讀。