Refactor GalleryPreviewsScene with Paging Compose

This commit is contained in:
tarsin committed 2023-05-10 21:37:40 +08:00
1 parent a3bdb70ef1
commit f91c69906f
3 files changed
+61 -50

No files matched your search

@@ -5,29 +5,26 @@ import androidx.compose.foundation.layout.Box
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.saveable.listSaver
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.runtime.snapshots.SnapshotStateList
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.paging.PagingSource
import androidx.paging.compose.LazyPagingItems
import com.hippo.widget.pullrefresh.PullRefreshIndicator
import com.hippo.widget.pullrefresh.pullRefresh
import com.hippo.widget.pullrefresh.rememberPullRefreshState
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import moe.tarsin.coroutines.runSuspendCatching
@Composable
inline fun <reified T : Parcelable> ContentLayout(
state: ContentState<T>,
noinline getData: suspend (Int) -> List<T>,
modifier: Modifier = Modifier,
content: @Composable (Array<T>) -> Unit,
content: @Composable (LazyPagingItems<T>) -> Unit,
) {
var refreshing by rememberSaveable { mutableStateOf(false) }
val coroutineScope = rememberCoroutineScope { Dispatchers.IO }
@@ -35,24 +32,18 @@ inline fun <reified T : Parcelable> ContentLayout(
refreshing = true
if (state.startPage == 0) {
coroutineScope.launch {
val result = runSuspendCatching { getData(0) }.getOrNull()
result?.let {
state.data.clear()
state.data.addAll(it)
}
}.invokeOnCompletion { refreshing = false }
} else {
TODO()
}
})
Box(modifier = Modifier.pullRefresh(refreshState)) {
content(state.data.toTypedArray())
PullRefreshIndicator(refreshing = refreshing, state = refreshState, modifier = modifier.align(Alignment.TopCenter))
}
}
class ContentState<T>(
val data: SnapshotStateList<T>,
class ContentState<T : Any>(
val data: PagingSource<Int, T>,
_startPage: MutableState<Int>,
_endPage: MutableState<Int>,
) {
@@ -61,17 +52,10 @@ class ContentState<T>(
}
@Composable
fun <T> rememberContentState(
initialData: List<T>,
fun <T : Any> rememberContentState(
source: PagingSource<Int, T>,
): ContentState<T> {
val snapshotStateListSaver = remember {
listSaver(
save = { it.toList() },
restore = { mutableStateListOf<T>().apply { addAll(it) } },
)
}
val data = rememberSaveable(saver = snapshotStateListSaver) { mutableStateListOf<T>().apply { addAll(initialData) } }
val startPage = rememberSaveable { mutableStateOf(0) }
val endPage = rememberSaveable { mutableStateOf(0) }
return remember { ContentState(data, startPage, endPage) }
return remember { ContentState(source, startPage, endPage) }
}