在 Jetpack @Compose 函数中使用 LiveData 作为状态
Using LiveData as state inside Jetpack @Compose functions
我想在 @Composable 函数中使用 LiveData<List<DataClass>>
作为我的状态源。
我不能使用新的@Model 注释,我在这个演讲中看到 Link(at 32:06) 可以通过调用函数 +observe(/* Data */)
.[=15= 来使用 LiveData、Flow 等]
问题:
我找不到视频中使用的函数 (+observe()) 或任何其他使用 LiveData 作为来源的方法。
如何在我的@Compose 函数中使用 LiveData?
项目 Gradle:
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"
}
}
应用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"
+observe
方法尚不可用,但它(或类似的东西)应该在 Jetpack Compose 的未来版本中可用。
如果你想在正式发布之前使用类似的功能,你可以使用我在这个博客中找到的这个功能post - 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
}
更新 从 0.1.0-dev05 开始,一元 (+) 运算符和 effectOf 已被弃用。此外 memo
已重命名为 remember
这是您应该使用的 -
@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
}
来源 - https://kotlinlang.slack.com/archives/CJLTWPH7S/p1581276282423600?thread_ts=1581276282.423600
0.1.0-dev09 now includes ui-livedata
. Example use here.
这是另一种使用状态观察实时数据的方法。有一个扩展功能,只需包含它即可。
在下面添加 gradle 依赖:
implementation 'androidx.compose.runtime:runtime-livedata:1.0.0-beta01'
例如,现在只需将您的常规 LiveData 转换为 State。
val breedItems by doggoViewModel.liveBreedData().observeAsState()
正如一些人已经指出的,您需要将新的依赖项添加到 build.gradle
implementation 'androidx.compose.runtime:runtime-livedata:1.0.0-beta01'
然后简单地:
val name: String by viewModel.name.observeAsState("")
如果这对您不起作用,请尝试下面的下一个。上面的语法显然更好,也被推荐但对我不起作用。
val nameState: State<String> = viewModel.name.observeAsState("")
nameState.value
另请参阅此处有关状态的文档 https://developer.android.com/jetpack/compose/state#viewmodel-state
我想在 @Composable 函数中使用 LiveData<List<DataClass>>
作为我的状态源。
我不能使用新的@Model 注释,我在这个演讲中看到 Link(at 32:06) 可以通过调用函数 +observe(/* Data */)
.[=15= 来使用 LiveData、Flow 等]
问题: 我找不到视频中使用的函数 (+observe()) 或任何其他使用 LiveData 作为来源的方法。 如何在我的@Compose 函数中使用 LiveData?
项目 Gradle:
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"
}
}
应用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"
+observe
方法尚不可用,但它(或类似的东西)应该在 Jetpack Compose 的未来版本中可用。
如果你想在正式发布之前使用类似的功能,你可以使用我在这个博客中找到的这个功能post - 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
}
更新 从 0.1.0-dev05 开始,一元 (+) 运算符和 effectOf 已被弃用。此外 memo
已重命名为 remember
这是您应该使用的 -
@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
}
来源 - https://kotlinlang.slack.com/archives/CJLTWPH7S/p1581276282423600?thread_ts=1581276282.423600
0.1.0-dev09 now includes ui-livedata
. Example use here.
这是另一种使用状态观察实时数据的方法。有一个扩展功能,只需包含它即可。
在下面添加 gradle 依赖:
implementation 'androidx.compose.runtime:runtime-livedata:1.0.0-beta01'
例如,现在只需将您的常规 LiveData 转换为 State。
val breedItems by doggoViewModel.liveBreedData().observeAsState()
正如一些人已经指出的,您需要将新的依赖项添加到 build.gradle
implementation 'androidx.compose.runtime:runtime-livedata:1.0.0-beta01'
然后简单地:
val name: String by viewModel.name.observeAsState("")
如果这对您不起作用,请尝试下面的下一个。上面的语法显然更好,也被推荐但对我不起作用。
val nameState: State<String> = viewModel.name.observeAsState("")
nameState.value
另请参阅此处有关状态的文档 https://developer.android.com/jetpack/compose/state#viewmodel-state