wenhaiz / ComposeRefreshLayout

A custom compose layout which supports refreshing and loading more gesture.
8 stars 2 forks source link

onLoadMore()会有不执行的情况 #3

Closed Null8889 closed 10 months ago

Null8889 commented 10 months ago

快速不断的上啦加载时,onLoadMore()会有不执行的case,footer不消失

data class UIState(val isSuccess:T?=null, var hasMoreData:Boolean?=null, val isLoading:Boolean=false,val isRefresh:Boolean?=null)

class MainViewModel :ViewModel() {

private val pageLiveData = MutableLiveData<Int>()

val dataList = SnapshotStateList<String>()

val dataLiveData = pageLiveData.switchMap { page->
    liveData {
        delay(2000)
        val strList = when(page){
            1-> (11..19).map { "$it" }
            2-> (20..29).map { "$it" }
            3-> (30..39).map { "$it" }
            4-> (40..49).map { "$it" }
            5-> (50..59).map { "$it" }
            6-> (60..69).map { "$it" }
            7-> (70..79).map { "$it" }
            8-> (80..89).map { "$it" }
            9-> (90..99).map { "$it" }
            else-> listOf("100","101","102")
        }
        emit(UIState(isSuccess = strList, isLoading = false, hasMoreData = strList.size < 11, isRefresh = (page == 1)))
    }
}

fun fetchData(page:Int){
    pageLiveData.value = page
}

}

@Composable fun Greeting() { val vm: MainViewModel = viewModel() val state = rememberRefreshLayoutState()

val lazyListState = rememberLazyListState()

var page by remember {
    mutableStateOf(0)
}

val listState = vm.dataLiveData.observeAsState()

LaunchedEffect(Unit) {
    state.refresh()
}

LaunchedEffect(listState.value) {
    listState.value?.isSuccess?.let {
        if (page == 1 && vm.dataList.isNotEmpty()) {
            vm.dataList.clear()
        }
        vm.dataList.addAll(it)
        lazyListState.animateScrollToItem(vm.dataList.size.minus(1))
    }
    if (listState.value?.isRefresh == true) {
        state.finishRefresh(
            success = listState.value?.isSuccess != null,
            hasMoreData = listState.value?.hasMoreData ?: false
        )
    } else if (listState.value?.isRefresh == false) {
        state.finishLoadMore(
            success = listState.value?.isSuccess != null,
            hasMoreData = listState.value?.hasMoreData ?: false
        )
    }
}

RefreshLayout(
    state = state,
    contentScrollState = lazyListState,
    onRefresh = {
        page = 1
        vm.fetchData(page)
    },
    onLoadMore = {
        page++
        vm.fetchData(page)
    },
    enableLoadMore = true,
    enableRefresh = true,
    header = {
        DefaultRefreshHeader(state = it)
    },
    footer = {
        DefaultRefreshFooter(state = it)
    }
) {
    if (vm.dataList.isNotEmpty()) {
        LazyColumn(
            state = lazyListState, modifier = Modifier
                .fillMaxSize()
                .background(Color.White)
        ) {
            items(vm.dataList) {
                Text(
                    text = "Hello $it",
                    fontSize = 20.sp,
                    color = Color.Black,
                    modifier = Modifier
                        .fillMaxWidth()
                        .height(30.dp)
                        .background(Color.White)
                )
                Spacer(modifier = Modifier.height(1.dp))
            }
        }
    }
}

}

wenhaiz commented 10 months ago

我排查一下

wenhaiz commented 10 months ago

修复了,试试 1.0.0-rc.2