Files
rider-pro-android-app/app/src/main/java/com/aiosman/ravenow/entity/Loader.kt
2024-12-01 09:40:13 +08:00

60 lines
1.5 KiB
Kotlin

package com.aiosman.ravenow.entity
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import com.aiosman.ravenow.data.ListContainer
abstract class DataLoader<T,ET> {
var list: MutableList<T> = mutableListOf()
var page by mutableStateOf(1)
var total by mutableStateOf(0)
var pageSize by mutableStateOf(10)
var hasNext by mutableStateOf(true)
var onListChanged: ((List<T>) -> Unit)? = null
private var firstLoad = true
abstract suspend fun fetchData(
page: Int, pageSize: Int, extra: ET
): ListContainer<T>
suspend fun loadData(
extra: ET
) {
if (!firstLoad) {
return
}
firstLoad = false
val result = fetchData(page, pageSize, extra)
list = result.list.toMutableList()
this.page = page
this.total = result.total
this.pageSize = pageSize
this.hasNext = result.list.size == pageSize
onListChanged?.invoke(list)
}
suspend fun loadMore(extra: ET) {
if (firstLoad) {
return
}
if (!hasNext) {
return
}
val result = fetchData(page + 1, pageSize, extra)
list.addAll(result.list)
page += 1
hasNext = result.list.size == pageSize
onListChanged?.invoke(list)
}
fun clear() {
list.clear()
page = 1
total = 0
pageSize = 10
hasNext = true
firstLoad = true
}
}