跳转到内容

PullToRefresh

PullToRefresh 是 Miuix 中的下拉刷新组件,可为列表和其他可滚动内容提供刷新功能。它采用“状态提升”模式,提供了带动画的交互式刷新指示器,适用于需要刷新数据的各种场景。

注意

此组件仅适用于支持触控的环境!

如需示例,请查看 Miuix Example 的 DropDowns 页。

引入

kotlin
import top.yukonga.miuix.kmp.basic.PullToRefresh
import top.yukonga.miuix.kmp.basic.rememberPullToRefreshState

基本用法

PullToRefresh 组件可以包裹任何可滚动的内容,采用“状态提升”模式:

kotlin
var isRefreshing by rememberSaveable { mutableStateOf(false) }
val pullToRefreshState = rememberPullToRefreshState()
var items by remember { mutableStateOf(1) }

LaunchedEffect(isRefreshing) {
    if (isRefreshing) {
        delay(500)
        items += 6
        isRefreshing = false
    }
}

Surface {
    PullToRefresh(
        isRefreshing = isRefreshing,
        onRefresh = { isRefreshing = true },
        pullToRefreshState = pullToRefreshState,
    ) {
        LazyColumn(
            modifier = Modifier.fillMaxSize()
        ) {
            items(items) { index ->
                ArrowPreference(
                    title = "Item $index",
                    modifier = Modifier.padding(horizontal = 16.dp),
                    onClick = { /* 点击事件 */ }
                )
            }
        }
    }
}

isRefreshing 契约

isRefreshing 是刷新操作的唯一事实来源,且为双向同步:在指示器空闲时将其置为 true 会程序化地展示刷新指示器(见下文),置回 false 则结束刷新。请在 onRefresh 中尽快将其置为 true——同步设置(如上例),或在 UI 作用域启动的协程中于首个挂起点之前设置。若指示器收回进入刷新状态时它仍为(或已重新变回)false,刷新会被视为已完成并立即播放完成动画;迟于此时到达的 true 会重新展示指示器。

组件状态

PullToRefresh 组件有以下几种状态:

  1. Idle:初始状态,无交互
  2. Pulling:用户正在下拉但尚未达到刷新阈值
  3. ThresholdReached:下拉达到阈值,松开可以刷新
  4. Refreshing:正在刷新
  5. RefreshComplete:刷新完成,正在回到初始状态

属性

PullToRefresh 属性

属性名类型说明默认值是否必须
isRefreshingBoolean是否正在刷新
onRefresh() -> Unit刷新触发时的回调函数
modifierModifier应用于容器的修饰符Modifier
pullToRefreshStatePullToRefreshState下拉刷新状态控制器rememberPullToRefreshState()
contentPaddingPaddingValues内容区的内边距PaddingValues(0.dp)
topAppBarScrollBehaviorScrollBehavior顶部应用栏滚动行为null
colorColor刷新指示器的颜色PullToRefreshDefaults.color
circleSizeDp刷新指示器圆圈的大小PullToRefreshDefaults.circleSize
refreshTextsList<String>不同状态下显示的文本列表PullToRefreshDefaults.refreshTexts
refreshTextStyleTextStyle刷新文本的样式PullToRefreshDefaults.refreshTextStyle
content@Composable () -> Unit可滚动内容的可组合函数

PullToRefreshState 类

PullToRefreshState 用于管理刷新指示器的 UI 状态,可通过 rememberPullToRefreshState() 创建。

属性名类型说明
refreshStateRefreshState当前刷新状态
isRefreshingBoolean是否正在刷新
pullProgressFloat下拉进度(0-1之间)
refreshCompleteAnimProgressFloat刷新完成动画进度

注意:PullToRefreshState 仅用于 UI 状态管理,刷新逻辑应通过 isRefreshingonRefresh 控制。

PullToRefreshDefaults 对象

PullToRefreshDefaults 提供下拉刷新组件的默认值。

属性名类型说明默认值
colorColor刷新指示器的默认颜色Color.Gray
circleSizeDp指示器圆圈的默认大小20.dp
refreshTextsList<String>默认的刷新文本列表["Pull down to refresh", "Release to refresh", "Refreshing...", "Refreshed successfully"]
refreshTextStyleTextStyle默认的文本样式TextStyle(fontSize = 14.sp, fontWeight = Bold, color = color)

进阶用法

程序化刷新

在指示器空闲时将 isRefreshing 置为 true,无需手势即可展示刷新指示器——例如进入页面时自动刷新:

kotlin
LaunchedEffect(Unit) {
    isRefreshing = true // 指示器展开并旋转,直到置回 false
}

注意:指示器展示期间内容的嵌套滚动会被消费,与手势触发的刷新行为一致。

自定义刷新指示器颜色

kotlin
PullToRefresh(
    color = Color.Blue,
    isRefreshing = isRefreshing,
    onRefresh = { isRefreshing = true },
    pullToRefreshState = pullToRefreshState
) {
    // 内容
}

自定义刷新文本

kotlin
PullToRefresh(
    isRefreshing = isRefreshing,
    onRefresh = { isRefreshing = true },
    pullToRefreshState = pullToRefreshState,
    refreshTexts = listOf(
        "下拉刷新",
        "松开刷新",
        "正在刷新",
        "刷新成功"
    )
) {
    // 内容
}

变更日志

基于 Apache-2.0 许可发布