在 Jetpack @Compose 函数中使用 LiveData 作为状态

2ja*_*222 11 android android-livedata android-jetpack android-jetpack-compose

我想LiveData<List<DataClass>>在 @Composable 函数中使用 a作为我的状态源。

我不能使用新的 @Model 注释,我在这个演讲中看到链接(在 32:06)可以通过调用函数来使用 LiveData、Flow 等+observe(/* Data */)

问题:我找不到视频中使用的函数 (+observe()) 或任何其他使用 LiveData 作为来源的方法。如何在 @Compose 函数中使用 LiveData?

项目摇篮:

buildscript {
    ext.kotlin_version = '1.3.60-eap-76'
    repositories {
        google()
        jcenter()
        maven { url 'https://dl.bintray.com/kotlin/kotlin-eap' }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:4.0.0-alpha04'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}
Run Code Online (Sandbox Code Playgroud)

应用程序gradle:依赖项:

   def lifecycle_version = "2.1.0"
   def compose_version = "0.1.0-dev02"

    // ViewModel and LiveData
    implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
    kapt "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
    androidTestImplementation "androidx.arch.core:core-testing:$lifecycle_version"

    implementation "androidx.compose:compose-runtime:$compose_version"
    kapt "androidx.compose:compose-compiler:$compose_version"

    // Android Compose
    implementation "androidx.ui:ui-layout:$compose_version"
    implementation "androidx.ui:ui-foundation:$compose_version"
    implementation "androidx.ui:ui-framework:$compose_version"
    implementation "androidx.ui:ui-tooling:$compose_version"
    implementation "androidx.ui:ui-android-text:$compose_version"
    implementation "androidx.ui:ui-text:$compose_version"
    implementation "androidx.ui:ui-material:$compose_version"


Run Code Online (Sandbox Code Playgroud)

ksy*_*sha 22

正如一些人已经指出的那样,您需要将新的依赖项添加到 build.gradle

implementation 'androidx.compose.runtime:runtime-livedata:1.0.0-beta01'

然后简单地说:

val name: String by viewModel.name.observeAsState("")
Run Code Online (Sandbox Code Playgroud)

如果这对您不起作用,请尝试下面的方法。上面的语法显然是更好的一种,也是推荐的,但对我来说不起作用。

val nameState: State<String> = viewModel.name.observeAsState("")
nameState.value
Run Code Online (Sandbox Code Playgroud)

另请参阅此处有关状态的文档https://developer.android.com/jetpack/compose/state#viewmodel-state

  • 实际上,`viewModel.name.observeAsState()`返回`State&lt;String&gt;`,而`viewModel.name.observeAsState("")`返回`String`。 (3认同)

vik*_*mar 8

这是使用状态观察实时数据的另一种方法。有一个扩展功能,只需包含它即可。

在下面添加 gradle 依赖项:

implementation 'androidx.compose.runtime:runtime-livedata:1.0.0-beta01'
Run Code Online (Sandbox Code Playgroud)

例如,现在只需将您的常规LiveData转换为 State

 val breedItems by doggoViewModel.liveBreedData().observeAsState()
Run Code Online (Sandbox Code Playgroud)


fal*_*fal 6

0.1.0-dev09现在包括ui-livedata. 示例在此处使用。

  • 对于 compose beta,现在是 `implementation "androidx.compose.runtime:runtime-livedata:$compose_version"` (2认同)

Vin*_*aba 5

+observe方法尚不可用,但它(或类似的东西)应该在未来的 Jetpack Compose 版本中可用。

如果你想在正式发布之前使用类似的功能,你可以使用我在这篇博文中找到的这个功能 - https://medium.com/swlh/android-mvi-with-jetpack-compose-b0890f5156ac

贴在下面方便消费

fun <T> observe(data: LiveData<T>) = effectOf<T?> {
    val result = +state<T?> { data.value }
    val observer = +memo { Observer<T> { result.value = it } }

    +onCommit(data) {
        data.observeForever(observer)
        onDispose { data.removeObserver(observer) }
    }

    result.value
}
Run Code Online (Sandbox Code Playgroud)

更新从 0.1.0-dev05 开始,一元(+) 运算符和 effectOf 已被弃用。也memo已重命名为rememberHere is what you should use -

@Composable
fun <T> observe(data: LiveData<T>): T? {
    var result by state { data.value }
    val observer = remember { Observer<T> { result = it } }

    onCommit(data) {
        data.observeForever(observer)
        onDispose { data.removeObserver(observer) }
    }

    return result
}
Run Code Online (Sandbox Code Playgroud)

来源 - https://kotlinlang.slack.com/archives/CJLTWPH7S/p1581276282423600?thread_ts=1581276282.423600