Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Compose use Flow<T>.collectAsState render List<T> LazyColumn progressive

I have a file list, need query data from each file, then render Result list to LazyColumn

But I dont want render list until all the query finished, like this:

class Repo {
    private val list = listOf(fileA, fileB)

    fun query(key: String): Flow<List<Result>> 
        = list.asFlow().map{ it.query(key) }.toList()
} 


@Composable
fun ListView(repo: Repo){
    val res = repo.query("xxx").collectAsState(xxx)

    LazyColumn{
        items(res){ xxx }
    }
}

How can I render a LazyColumn from Flow.collectAsState progressive


class Repo {
    private val list = listOf(fileA, fileB)

    fun query(key: String): Flow<Result> 
        = list.asFlow().map{ it.query(key) }
} 

@Composable
fun ListView(repo: Repo){
    val res = repo.query("xxx").collectAsState(xxx)

    LazyColumn{
        // ???
        items(res){ xxx }
    }
}
like image 478
user4097210 Avatar asked Oct 22 '25 03:10

user4097210


1 Answers

Just found derivedStateOf function work perfect for this.


class Repo {
    private val list = listOf(fileA,fileB)

    fun query(key: String): Flow<Result> = list.asFlow().map{xxx}
} 

@Composable
fun ListView(repo: Repo){
    val flow = repo.query("xxx").collectAsState(xxx)

    val update by remember {
        val data = mutableListOf<Result>()

        derivedStateOf {
            flow?.run(data::add)
            data
        }
    }

    LazyColumn {
        items(update) { data: Result ->
            xxxx
        }
    }

}
like image 167
user4097210 Avatar answered Oct 23 '25 18:10

user4097210