使用 IntelliJ IDEA 偵錯 Kotlin Flow – 教學課程
本教學課程示範如何建立 Kotlin Flow 並使用 IntelliJ IDEA 偵錯。
本教學課程假設您已具備 協程 和 Kotlin Flow 概念的基礎知識。
建立 Kotlin Flow
建立一個具有慢速發射器和慢速收集器的 Kotlin flow:
在 IntelliJ IDEA 中開啟一個 Kotlin 專案。如果您沒有專案,請建立一個。
若要在 Gradle 專案中使用
kotlinx.coroutines函式庫,請將以下依賴項新增至build.gradle(.kts):kotlindependencies { implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2") }groovydependencies { implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2' }對於其他建置系統,請參閱
kotlinx.coroutinesREADME 中的說明。開啟
src/main/kotlin中的Main.kt檔案。src目錄包含 Kotlin 原始碼檔案和資源。Main.kt檔案包含將印出Hello World!的範例程式碼。建立傳回三個數字流的
simple()函數:kotlinimport kotlinx.coroutines.* import kotlinx.coroutines.flow.* import kotlin.system.* fun simple(): Flow<Int> = flow { for (i in 1..3) { delay(100) emit(i) } }更改
main()函數中的程式碼:- 使用
runBlocking()區塊來包裝協程。 - 使用
collect()函數收集發射的值。 - 使用
delay()函數模仿耗費 CPU 的程式碼。它會暫停協程 300 毫秒而不會阻塞執行緒。 - 使用
println()函數印出從流中收集的值。
kotlinfun main() = runBlocking { simple() .collect { value -> delay(300) println(value) } }- 使用
點擊 Build Project (建置專案) 來建置程式碼。

偵錯協程
在呼叫
emit()函數的行上設定斷點:
點擊畫面頂部執行組態旁的 Debug (偵錯) 來以偵錯模式執行程式碼。

Debug (偵錯) 工具視窗隨即出現:
- Frames (堆疊影格) 索引標籤包含呼叫堆疊。
- Variables (變數) 索引標籤包含當前上下文中的變數。它告訴我們流正在發射第一個值。
- Coroutines (協程) 索引標籤包含有關執行中或已暫停協程的資訊。

點擊 Debug (偵錯) 工具視窗中的 Resume Program (繼續程式) 以繼續偵錯工作階段。程式會停在相同的斷點。

現在流發射第二個值。

優化移除的變數
如果您使用 suspend 函數,在偵錯器中,您可能會在變數名稱旁邊看到「was optimized out」(已優化移除) 的文字:

此文字表示變數的生命週期已縮短,並且該變數已不再存在。 由於您看不到它們的值,因此很難偵錯帶有優化變數的程式碼。 您可以使用 -Xdebug 編譯器選項停用此行為。
切勿在生產環境中使用此標誌:
-Xdebug可能會導致記憶體洩漏。
新增一個並行執行的協程
開啟
src/main/kotlin中的Main.kt檔案。增強程式碼以並行執行發射器和收集器:
- 新增一個對
buffer()函數的呼叫,以並行執行發射器和收集器。buffer()會儲存發射的值並在單獨的協程中執行流收集器。
kotlinfun main() = runBlocking<Unit> { simple() .buffer() .collect { value -> delay(300) println(value) } }- 新增一個對
點擊 Build Project (建置專案) 來建置程式碼。
偵錯帶有兩個協程的 Kotlin Flow
在
println(value)處設定一個新斷點。點擊畫面頂部執行組態旁的 Debug (偵錯) 來以偵錯模式執行程式碼。

Debug (偵錯) 工具視窗隨即出現。
在 Coroutines (協程) 索引標籤中,您可以看到有兩個協程正在並行執行。由於
buffer()函數,流收集器和發射器在單獨的協程中執行。buffer()函數會緩衝從流中發射的值。 發射器協程處於 RUNNING (執行中) 狀態,而收集器協程處於 SUSPENDED (已暫停) 狀態。點擊 Debug (偵錯) 工具視窗中的 Resume Program (繼續程式) 以繼續偵錯工作階段。

現在收集器協程處於 RUNNING (執行中) 狀態,而發射器協程處於 SUSPENDED (已暫停) 狀態。
您可以深入探究每個協程來偵錯您的程式碼。
