Skip to main content

kotlin init 前初始化屬性會發生啥事

Kotlin 的 class 內部,在初始化階段,是無情地由上到下執行的

Kotlin

// 下面這樣寫會發生啥事,不會發生啥事,因為編譯不過,所以不能跑
class ItemEditViewModel(...) : ViewModel() {
    init {


            itemUiState = itemsRepository.getItemStream(itemId)
                .filterNotNull()
                .first()
                .toItemUiState(true)
        
        // ... use itemId ...
    }
// ❌ 錯誤示範. 屬性後初始化
    private val itemId: Int = checkNotNull(savedStateHandle[ItemEditDestination.itemIdArg])
}

那我加上一個 非同步處理,如下,這樣會發生啥事

init {
        viewModelScope.launch {
            itemUiState = itemsRepository.getItemStream(itemId)
                .filterNotNull()
                .first()
                .toItemUiState(true)
        }
    }
private val itemId: Int = checkNotNull(savedStateHandle[ItemEditDestination.itemIdArg])

可以編譯過,但是會有問題
getItemStream 會永遠是只讀取到0.主要是因為 Int 的預設值就是0