|
| 1 | +# PullToRefresh |
| 2 | + |
| 3 | +`PullToRefresh` 是 Miuix 中的下拉刷新组件,可为列表和其他可滚动内容提供刷新功能。它提供了具有动画效果的交互式刷新指示器,适用于需要刷新数据的各种场景。 |
| 4 | + |
| 5 | +## 引入 |
| 6 | + |
| 7 | +```kotlin |
| 8 | +import top.yukonga.miuix.kmp.basic.PullToRefresh |
| 9 | +import top.yukonga.miuix.kmp.basic.rememberPullToRefreshState |
| 10 | +``` |
| 11 | + |
| 12 | +## 基本用法 |
| 13 | + |
| 14 | +PullToRefresh 组件可以包裹任何可滚动的内容: |
| 15 | + |
| 16 | +```kotlin |
| 17 | +val pullToRefreshState = rememberPullToRefreshState() |
| 18 | +var items by remember { mutableStateOf(1) } |
| 19 | +val scope = rememberCoroutineScope() |
| 20 | +Surface{ |
| 21 | + PullToRefresh( |
| 22 | + pullToRefreshState = pullToRefreshState, |
| 23 | + onRefresh = { |
| 24 | + scope.launch { |
| 25 | + // 确定刷新状态 |
| 26 | + if (pullToRefreshState.isRefreshing) { |
| 27 | + delay(300) // 模拟刷新操作 |
| 28 | + // 刷新完成 |
| 29 | + pullToRefreshState.completeRefreshing { |
| 30 | + // 更新数据 |
| 31 | + items++ |
| 32 | + } |
| 33 | + } |
| 34 | + } |
| 35 | + } |
| 36 | + ) { |
| 37 | + LazyColumn( |
| 38 | + modifier = Modifier.fillMaxSize() |
| 39 | + ) { |
| 40 | + items(items) { index -> |
| 41 | + SuperArrow( |
| 42 | + title = "Item $index", |
| 43 | + modifier = Modifier.padding(horizontal = 16.dp), |
| 44 | + onClick = { /* 点击事件 */ } |
| 45 | + ) |
| 46 | + } |
| 47 | + } |
| 48 | + } |
| 49 | +} |
| 50 | +``` |
| 51 | + |
| 52 | +## 组件状态 |
| 53 | + |
| 54 | +PullToRefresh 组件有以下几种状态: |
| 55 | + |
| 56 | +1. `Idle`:初始状态,无交互 |
| 57 | +2. `Pulling`:用户正在下拉但尚未达到刷新阈值 |
| 58 | +3. `ThresholdReached`:下拉达到阈值,松开可以刷新 |
| 59 | +4. `Refreshing`:正在刷新 |
| 60 | +5. `RefreshComplete`:刷新完成,正在回到初始状态 |
| 61 | + |
| 62 | +```kotlin |
| 63 | +val pullToRefreshState = rememberPullToRefreshState() |
| 64 | +// 检查是否正在刷新 |
| 65 | +if (pullToRefreshState.isRefreshing) { |
| 66 | + // 正在刷新时的逻辑 |
| 67 | + delay(2000) // 模拟网络请求 |
| 68 | + pullToRefreshState.completeRefreshing {} // 完成刷新时的回调 |
| 69 | +} |
| 70 | +``` |
| 71 | + |
| 72 | +## 属性 |
| 73 | + |
| 74 | +### PullToRefresh 属性 |
| 75 | + |
| 76 | +| 属性名 | 类型 | 默认值 | 说明 | |
| 77 | +| ------------------ | ---------------------- | -------------------------------------- | ------------------------ | |
| 78 | +| pullToRefreshState | PullToRefreshState | - | 下拉刷新状态控制器 | |
| 79 | +| onRefresh | () -> Unit | {} | 刷新触发时的回调函数 | |
| 80 | +| modifier | Modifier | Modifier | 应用于容器的修饰符 | |
| 81 | +| color | Color | PullToRefreshDefaults.color | 刷新指示器的颜色 | |
| 82 | +| circleSize | Dp | PullToRefreshDefaults.circleSize | 刷新指示器圆圈的大小 | |
| 83 | +| refreshTexts | List\<String> | PullToRefreshDefaults.refreshTexts | 不同状态下显示的文本列表 | |
| 84 | +| refreshTextStyle | TextStyle | PullToRefreshDefaults.refreshTextStyle | 刷新文本的样式 | |
| 85 | +| content | @Composable () -> Unit | - | 可滚动内容的可组合函数 | |
| 86 | + |
| 87 | +### PullToRefreshState 类 |
| 88 | + |
| 89 | +PullToRefreshState 是控制下拉刷新状态的类,可以通过 `rememberPullToRefreshState()` 创建。 |
| 90 | + |
| 91 | +#### 属性 |
| 92 | + |
| 93 | +| 属性名 | 类型 | 说明 | |
| 94 | +| --------------------------- | ------------ | ------------------- | |
| 95 | +| refreshState | RefreshState | 当前刷新状态 | |
| 96 | +| isRefreshing | Boolean | 是否正在刷新 | |
| 97 | +| pullProgress | Float | 下拉进度(0-1之间) | |
| 98 | +| refreshCompleteAnimProgress | Float | 刷新完成动画进度 | |
| 99 | + |
| 100 | +#### 方法 |
| 101 | + |
| 102 | +| 方法名 | 参数 | 返回类型 | 说明 | |
| 103 | +| ------------------ | -------------------- | -------- | ------------------------ | |
| 104 | +| completeRefreshing | (suspend () -> Unit) | - | 完成刷新并执行提供的操作 | |
| 105 | + |
| 106 | +### PullToRefreshDefaults 对象 |
| 107 | + |
| 108 | +PullToRefreshDefaults 对象提供了下拉刷新组件的默认值。 |
| 109 | + |
| 110 | +| 属性名 | 类型 | 默认值 | 说明 | |
| 111 | +| ---------------- | ------------- | --------------------------------------------------- | -------------------- | |
| 112 | +| color | Color | Color.Gray | 刷新指示器的默认颜色 | |
| 113 | +| circleSize | Dp | 20.dp | 指示器圆圈的默认大小 | |
| 114 | +| refreshTexts | List\<String> | ["Pull down to refresh", "Release to refresh", ...] | 默认的刷新文本列表 | |
| 115 | +| refreshTextStyle | TextStyle | TextStyle(fontSize = 14.sp, fontWeight = Bold, ...) | 默认的文本样式 | |
| 116 | + |
| 117 | +## 进阶用法 |
| 118 | + |
| 119 | +### 自定义刷新指示器颜色 |
| 120 | + |
| 121 | +```kotlin |
| 122 | +val pullToRefreshState = rememberPullToRefreshState() |
| 123 | +PullToRefresh( |
| 124 | + pullToRefreshState = pullToRefreshState, |
| 125 | + color = Color.Blue, |
| 126 | + onRefresh = { |
| 127 | + // 执行刷新操作 |
| 128 | + } |
| 129 | +) { |
| 130 | + // 内容 |
| 131 | +} |
| 132 | +``` |
| 133 | + |
| 134 | +### 自定义刷新文本 |
| 135 | + |
| 136 | +```kotlin |
| 137 | +val pullToRefreshState = rememberPullToRefreshState() |
| 138 | +PullToRefresh( |
| 139 | + pullToRefreshState = pullToRefreshState, |
| 140 | + refreshTexts = listOf( |
| 141 | + "下拉刷新", |
| 142 | + "松开刷新", |
| 143 | + "正在刷新", |
| 144 | + "刷新成功" |
| 145 | + ), |
| 146 | + onRefresh = { |
| 147 | + // 执行刷新操作 |
| 148 | + } |
| 149 | +) { |
| 150 | + // 内容 |
| 151 | +} |
| 152 | +``` |
| 153 | + |
| 154 | +### 结合加载状态使用 |
| 155 | + |
| 156 | +```kotlin |
| 157 | +val pullToRefreshState = rememberPullToRefreshState() |
| 158 | +var items by remember { mutableStateOf(List(5) { "Item $it" }) } |
| 159 | +val scope = rememberCoroutineScope() |
| 160 | +PullToRefresh( |
| 161 | + pullToRefreshState = pullToRefreshState, |
| 162 | + onRefresh = { |
| 163 | + scope.launch { |
| 164 | + delay(2000) // 模拟刷新操作 |
| 165 | + pullToRefreshState.completeRefreshing { |
| 166 | + items = List(8) { "Updated Item $it" } |
| 167 | + } |
| 168 | + } |
| 169 | + } |
| 170 | +) { |
| 171 | + LazyColumn( |
| 172 | + modifier = Modifier.fillMaxSize() |
| 173 | + ) { |
| 174 | + items(items.size) { item -> |
| 175 | + Text( |
| 176 | + text = items[item], |
| 177 | + modifier = Modifier |
| 178 | + .padding(16.dp) |
| 179 | + .fillMaxSize() |
| 180 | + ) |
| 181 | + } |
| 182 | + } |
| 183 | +} |
| 184 | +``` |
0 commit comments