Kotlin으로 아래로 당겼을 때 화면이 새로고침 되는 것을
Swiperefreshlayout
를 사용하여 구현하였는데, Jetpack Compose에서도 해당 기능을 구현 하고 싶어 찾아보다rememberPullToRefreshState
라는 것을 알게 되었다.
rememberPullToRefreshState
를 사용하여 당겨서 새로고침 되는 화면을 구현하는 방법을 정리하고자 한다.
rememberPullToRefreshState
는 사용자가 화면을 당겨 새로고침을 트리거하는 패턴인Pull to Refresh
기능을 구현할 때 사용되며,Pull to Refresh
상태를 기억하고 관리하는 데 사용된다.
Pull to Refresh
의 상태를 기억하는 rememberPullToRefreshState
함수를 변수에 선언한다.val refreshState = rememberPullToRefreshState()
refreshState.isRefreshing
는 새로고침 상태를 나타내는 Boolean 값이다.onRefresh()
함수가 호출되고, onRefresh()
함수 내에서 데이터 새로고침 작업을 수행한다.refreshState.endRefresh()
를 호출하여 새로고침 상태를 종료한다.if (refreshState.isRefreshing) {
onRefresh()
refreshState.endRefresh()
}
Box
에서nestedScroll
를 사용하여 Pull to Refresh
동작을 처리한다. .nestedScroll(refreshState.nestedScrollConnection)
verticalScroll(rememberScrollState())
를 사용하여 스크롤을 가능하게 만든다.PullToRefreshContainer
: Pull to Refresh
인디케이터를 화면 상단에 표시하며, state로 refreshState를 전달하여 새로고침 상태를 관리한다.Surface(
modifier = Modifier.padding(innerPadding),
color = MaterialTheme.colors.gray9
) {
Box(
modifier = Modifier
.fillMaxSize()
.verticalScroll(rememberScrollState())
.nestedScroll(refreshState.nestedScrollConnection)
) {
Column( // 새로고침 가능한 영역
modifier = Modifier
.fillMaxSize()
.verticalScroll(rememberScrollState())
.padding(horizontal = Paddings.xlarge),
) {
...
}
PullToRefreshContainer(
state = refreshState,
containerColor = MaterialTheme.colors.gray9,
contentColor = MaterialTheme.colors.primary,
modifier = Modifier.align(Alignment.TopCenter)
)
}
}
👀 동작 과정을 다시 정리해보면 !
1. Column 영역에서 스크롤을 아래로 당긴다.
2.nestedScrollConnection
을 통해 새로고침 동작이 트리거된다.
3.refreshState.isRefreshing
가 true로 설정되면onRefresh()
함수가 호출되어 데이터 새로고침 작업이 수행된다.
4. 새로고침 작업이 완료되면refreshState.endRefresh()
가 호출되어 새로고침 상태가 종료된다.
5.PullToRefreshContainer
는 새로고침 인디케이터를 화면 상단에 표시하고, 새로고침 상태에 따라 인디케이터를 제어한다.