@Composable
fun SimpleLoading() {
LoadingContent(loader = LoadingFunctions::simpleLoad) { successData ->
SuccessResult(text = successData)
}
}demo_cn.mp4
Demo: 点此下载
ComposeLoading 是对 Jetpack Compose 加载场景的简单封装,其设计在于简洁、易用,让开发者能够在 Jetpack Compose 中快速实现加载页面,减少模板代码的书写。只需传入加载函数,我们即可帮您自动处理加载中、加载失败、加载成功的页面展示,并可在加载失败时点击重试。
在项目中添加 jitpack.io 的储存库,之后在模块级别的 build.gradle 中添加依赖
implementation 'com.github.FunnySaltyFish:ComposeLoading:v1.0.4' // 这个版本不一定最新,请参考 https://jitpack.io/#FunnySaltyFish/ComposeLoading 的最新版本@Composable
fun SimpleLoading() {
// loader 即为加载函数,比如从网络请求数据、从数据库查询数据等
LoadingContent(loader = LoadingFunctions::simpleLoad) { successData ->
// successData 即为加载成功后的数据,可以在 success 中访问到
SuccessResult(text = successData)
}
}LoadingContent 中传入的 loader 函数即为加载函数(比如网络请求、数据库查询等),返回值即为加载的结果,你可以在 success (也就是加载成功后展现的页面)中访问到该结果。
函数内部持有一个 boolean 类型的 key,每次 retry 时会更改 key 的值,触发 Recomposition,从而触发重新加载。
有些情况下,你可能希望 key 由外部控制,从而更精细的控制重试的逻辑。你可以如下使用
@Composable
fun LoadWithKey() {
var key by remember { mutableStateOf(0) }
Column {
LoadingContent(retryKey = key, updateRetryKey = { key++ }, loader = { LoadingFunctions.loadWithKey(key) }) {
SuccessResult(text = it)
}
Button(onClick = { key++ }) {
Text(text = stringResource(R.string.increment_key_and_retry))
}
}
}在这个例子中,retryKey 和 updateRetryKey 为手动传入,updateRetryKey 为点击重试时触发的函数,你可以在其中更改 retryKey 的值,从而触发重新加载。
传入 loading 和 failure 即可
@Composable
fun LoadWithCustomComposable() {
LoadingContent(
modifier = Modifier.fillMaxWidth(),
loader = LoadingFunctions::loadMightFailed,
// 自定义加载中的页面
loading = {
CircularProgressIndicator(modifier = Modifier.size(48.dp).align(Alignment.TopCenter))
},
// 自定义失败页面
failure = { error, retry ->
Column(
Modifier.fillMaxSize(),
verticalArrangement = Arrangement.spacedBy(8.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(text = error.message ?: "Unknown error", color = MaterialTheme.colorScheme.error)
Button(onClick = retry) {
Text(text = stringResource(R.string.retry))
}
}
}
) {
SuccessResult(text = it)
}
}LoadingContent 中的内容均在 Box 包裹下,因此可以使用 BoxScope 中的属性,比如 Modifier.align。
我们也提供了 LazyColumn 的版本,使用如下:
@Composable
fun SimpleLoadingList() {
val (listState, retry) = rememberRetryableLoadingState(loader = LoadingFunctions::loadList)
LazyColumn(
Modifier.fillMaxSize(),
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
loadingList(listState, retry, { it }) {
SuccessResult(text = it)
}
}
}rememberRetryableLoadingState 返回了两个值,一是 LoadingState,二是 retry 函数,retry 函数用于重试,LoadingState: MutableState<LoadingState<T>> 用于存储加载状态。
v1.0.2 起也新增了对 LazyGrid 和 LazyStaggeredGrid 的支持,可以参考 Examples.kt
您也可以通过 empty 设置空列表时显示的内容;通过 successHeader 和 successFooter 设置额外的 header 和 footer
项目也包含了一个 LoadingState 类,用于存储加载状态,它的定义如下:
/**
* A sealed class to represent the state of loading.
*
* R: The type of data that will be loaded.
* @property isLoading Boolean Whether the loading is in progress.
* @property isSuccess Boolean Whether the loading is successful.
*/
sealed class LoadingState<out R> {
object Loading : LoadingState<Nothing>()
data class Failure(val error : Throwable) : LoadingState<Nothing>()
data class Success<T>(val data : T) : LoadingState<T>()
val isLoading
get() = this is Loading
val isSuccess
get() = this is Success<*>
}可以拿来使用
ComposeLoadingConfig 提供了一些配置,目前有
DEBUG:设置为 true 后,会输出一些日志信息,默认为 false
此库是我在编写 译站 时逐步写下的,现在整理出来单独发布。它的技术含量并不高,但在实用性上应该具一定价值,因此开源出来。 更复杂的用法可以见上面译站的项目代码,全局搜索 LoadingContent 和 loadingList 即可