在 Kotlin 中 LiveData null 安全吗?为什么Android Studio可以编译呢?

Hel*_*oCW 2 kotlin android-jetpack

在我看来,Kotlin 是零安全的。

代码 A 来自项目 Universal Android Music Player Sample,你可以在这里看到

val rootMediaId: LiveData<String>代码A中好像不是空安全的,可以给空字符串赋值rootMediaId,不知道为什么Android Studio可以编译这些代码,能告诉我吗?

我认为代码 B 是有信誉的代码。

代码 A

viewModel.rootMediaId.observe(this,
                Observer<String> { rootMediaId ->
                    if (rootMediaId != null) {
                        navigateToMediaItem(rootMediaId)
                    }
                })



class MainActivityViewModel(
    private val musicServiceConnection: MusicServiceConnection
) : ViewModel() {

    val rootMediaId: LiveData<String> =
        Transformations.map(musicServiceConnection.isConnected) { isConnected ->
            if (isConnected) {
                musicServiceConnection.rootMediaId
            } else {
                null
            }
        }
   ...
}
Run Code Online (Sandbox Code Playgroud)

代码 B

class MainActivityViewModel(
    private val musicServiceConnection: MusicServiceConnection
) : ViewModel() {

    val rootMediaId: LiveData<String?> =
        Transformations.map(musicServiceConnection.isConnected) { isConnected ->
            if (isConnected) {
                musicServiceConnection.rootMediaId
            } else {
                null
            }
        }
   ...
}
Run Code Online (Sandbox Code Playgroud)

And*_*ana 5

因为 Live Data 是用 Java 编写的,所以 Kotlin 在这里使用了平台类型。您可以在此处阅读更多相关信息。简而言之:Java 类型不包含可空性信息,因此 Kolin 无法推断出正确的类型。String从 Java 可以StringString?在 Kotlin 中。Android Studio 将此类String类型标记为String!您可以自己关注并设置合适的类型。