翻译和简单修改,原文:https://google.github.io/accompanist/swiperefresh/#migration
(新)
用于 Jetpack Compose 的刷新指示器在 Compose Material 1.3.0 中,Accompanist SwipeRefresh
已被 PullRefresh
所取代。实现方式类似,但它不是一个可组合函数,而是一个可应用于可组合函数的修改器。
下面是一个简单的示例:
// 状态可以由 ViewModel 提供
val viewModel: MyViewModel = viewModel()
val refreshing by viewModel.isRefreshing// 当前是否要刷新
// 获取状态:使用 ViewModel 中的状态初始化
val pullRefreshState = rememberPullRefreshState(refreshing, { viewModel.refresh() })
// 你自定义容器,比如Box,使用其中的 Modifier 的函数即可控制
Box(Modifier.pullRefresh(pullRefreshState)) {
LazyColumn(Modifier.fillMaxSize()) {// 列表
...
}
PullRefreshIndicator(// 指示器
refreshing, // 当前是否要刷新
pullRefreshState,
Modifier.align(Alignment.TopCenter))
}
与其使用提供的可组合 PullRefreshIndicator,您可以创建您自己的
旧的
文档参考:
一个提供刷新用户体验模式的布局库,类似于 Android 的 SwipeRefreshLayout。
repositories {
mavenCentral()
}
dependencies {
implementation "com.google.accompanist:accompanist-swiperefresh:" // 本次我用的版本:0.30.1
}
要实现这种用户体验模式,需要两个关键的应用程序接口: SwipeRefresh(提供布局)和 rememberSwipeRefreshState()(提供一些记忆状态)。
使用 ViewModel 的 SwipeRefresh 的基本用法如下:
val viewModel: MyViewModel = viewModel()
val isRefreshing by viewModel.isRefreshing.collectAsState()
SwipeRefresh(
state = rememberSwipeRefreshState(isRefreshing),
onRefresh = { viewModel.refresh() },
) {
LazyColumn {
items(30) { index ->
// TODO: list items
}
}
}
内容需要 “可垂直滚动”,SwipeRefresh() 才能对轻扫手势做出反应。LazyColumn 等布局可以自动垂直滚动,但 Column 或 LazyRow 等布局则不行。在这种情况下,你可以为该内容提供一个 Modifier.verticalScroll 修改器,就像这样:
SwipeRefresh(
// ...
) {
Column(Modifier.verticalScroll(rememberScrollState())) {
// content
}
}
由于该库是通过一个独立的状态对象构建的,因此很容易显示刷新指示器,而无需轻扫触发。
下面这个不切实际的示例就显示了一个永远刷新的指示器:
val swipeRefreshState = rememberSwipeRefreshState(true)
SwipeRefresh(
state = swipeRefreshState,
onRefresh = { /* todo */ },
) {
LazyColumn {
items(30) { index ->
// TODO: list items
}
}
}
库提供了一个默认指示器: SwipeRefreshIndicator() 是 SwipeRefresh 自动使用的指示器。您可以自定义默认指示器,甚至使用指示器槽提供自己的指示器内容。
自定义默认指示器
要自定义默认指示器,我们可以提供自己的指示器内容块,使用自定义参数调用 SwipeRefreshIndicator() :
SwipeRefresh(
state = /* ... */,
onRefresh = /* ... */,
indicator = { state, trigger ->
SwipeRefreshIndicator(
// Pass the SwipeRefreshState + trigger through
state = state,
refreshTriggerDistance = trigger,
// Enable the scale animation
scale = true,
// Change the color and shape
backgroundColor = MaterialTheme.colors.primary,
shape = MaterialTheme.shapes.small,
)
}
)
如前所述,您也可以提供自己的自定义指示器内容。我们会为指示器内容槽提供一个 SwipeRefreshState,其中包含对刷新手势做出反应所需的信息。