跳转到内容

PullToRefresh

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

引入

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

基本用法

PullToRefresh 组件可以包裹任何可滚动的内容:

kotlin
val pullToRefreshState = rememberPullToRefreshState()
var items by remember { mutableStateOf(1) }
val scope = rememberCoroutineScope()

Surface {
    PullToRefresh(
        pullToRefreshState = pullToRefreshState,
        onRefresh = {
            scope.launch {
                // 确定刷新状态
                if (pullToRefreshState.isRefreshing) {
                    delay(300) // 模拟刷新操作
                    // 刷新完成
                    pullToRefreshState.completeRefreshing {
                        // 更新数据
                        items++
                    }
                }
            }
        }
    ) {
        LazyColumn(
            modifier = Modifier.fillMaxSize()
        ) {
            items(items) { index ->
                SuperArrow(
                    title = "Item $index",
                    modifier = Modifier.padding(horizontal = 16.dp),
                    onClick = { /* 点击事件 */ }
                )
            }
        }
    }
}

组件状态

PullToRefresh 组件有以下几种状态:

  1. Idle:初始状态,无交互
  2. Pulling:用户正在下拉但尚未达到刷新阈值
  3. ThresholdReached:下拉达到阈值,松开可以刷新
  4. Refreshing:正在刷新
  5. RefreshComplete:刷新完成,正在回到初始状态
kotlin
val pullToRefreshState = rememberPullToRefreshState()
// 检查是否正在刷新
if (pullToRefreshState.isRefreshing) {
    // 正在刷新时的逻辑
    delay(2000) // 模拟网络请求
    pullToRefreshState.completeRefreshing {} // 完成刷新时的回调
}

属性

PullToRefresh 属性

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

PullToRefreshState 类

PullToRefreshState 用于控制下拉刷新状态,可通过 rememberPullToRefreshState() 创建。

属性

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

方法

方法名参数说明是否必须
completeRefreshing(suspend () -> Unit)完成刷新并执行提供的操作

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)

进阶用法

自定义刷新指示器颜色

kotlin
val pullToRefreshState = rememberPullToRefreshState()

PullToRefresh(
    pullToRefreshState = pullToRefreshState,
    color = Color.Blue,
    onRefresh = { 
        // 执行刷新操作
    }
) {
    // 内容
}

自定义刷新文本

kotlin
val pullToRefreshState = rememberPullToRefreshState()

PullToRefresh(
    pullToRefreshState = pullToRefreshState,
    refreshTexts = listOf(
        "下拉刷新",
        "松开刷新",
        "正在刷新",
        "刷新成功"
    ),
    onRefresh = {
        // 执行刷新操作
    }
) {
    // 内容
}

结合加载状态使用

kotlin
val pullToRefreshState = rememberPullToRefreshState()
var items by remember { mutableStateOf(List(5) { "Item $it" }) }
val scope = rememberCoroutineScope()

PullToRefresh(
    pullToRefreshState = pullToRefreshState,
    onRefresh = {
        scope.launch {
            delay(2000) // 模拟刷新操作
            pullToRefreshState.completeRefreshing {
                items = List(8) { "Updated Item $it" }
            }
        }
    }
) {
    LazyColumn(
        modifier = Modifier.fillMaxSize()
    ) {
        items(items.size) { item ->
            Text(
                text = items[item],
                modifier = Modifier
                    .padding(16.dp)
                    .fillMaxSize()
            )
        }
    }
}

基于 Apache-2.0 许可发布