Alexander Maryanovsky
03/26/2022, 1:32 PMColumn
where each row “knows” its index, like so:
@Composable
fun IndexedColumn(
content: @Composable IndexedColumnScope.() -> Unit
){
Column {
content.invoke(IndexedColumnScope())
}
}
class IndexedColumnScope{
var index = 0
@Composable
fun row(
rowContent: @Composable IndexedRowScope.() -> Unit
){
val rowIndex = remember { index++ }
rowContent.invoke(IndexedRowScope(rowIndex))
}
}
class IndexedRowScope(
val rowIndex: Int
)
@Composable
fun UseIndexedColumn(){
IndexedColumn{
repeat(5) {
row{
Text("Row $rowIndex")
}
}
}
}
The problem is with the var index
— when a row changes, row
is called again (not recomposition, but regular composition) and index
increases again. So if I had at the beginning
Row 0
Row 1
Row 2
Row 3
Row 4
and then row 2 changes from Text
to BasicTextField
, I’d have
Row 0
Row 1
Row 5 <-- BasicTextField
Row 3
Row 4
Alexander Maryanovsky
03/26/2022, 2:27 PMshikasd
03/26/2022, 3:46 PMrepeat
loop as a parameter to the row
function?Alexander Maryanovsky
03/26/2022, 4:45 PMAlexander Maryanovsky
03/26/2022, 4:46 PMAlexander Maryanovsky
03/26/2022, 7:26 PMclass IndexedColumnScope{
var index = 0
@Composable
fun row(
rowContent: @Composable IndexedRowScope.() -> Unit
){
val rowIndex = remember {
index++
}
rowContent.invoke(IndexedRowScope(rowIndex))
}
}
class IndexedRowScope(
val rowIndex: Int
)
@Composable
fun UseIndexedColumn(){
IndexedColumn{
repeat(10) {
var showFirst by remember { mutableStateOf(true) }
if (showFirst){
row{
Text(
text ="Row $rowIndex",
modifier = Modifier
.clickable {
isText = false
}
)
}
}
else{
row{
Text(
text = "Row $rowIndex",
modifier = Modifier
.background(Color.Gray)
.clickable {
isText = true
}
)
}
}
}
}
}
Alexander Maryanovsky
03/26/2022, 7:30 PMAlexander Maryanovsky
03/26/2022, 7:31 PMshikasd
03/26/2022, 8:04 PMZach Klippenstein (he/him) [MOD]
03/26/2022, 9:05 PMLazyColumn
here? It gives you that for freeAlexander Maryanovsky
03/26/2022, 9:26 PMLazyColumn
give me the index for free?myanmarking
03/26/2022, 10:14 PMAlexander Maryanovsky
03/27/2022, 4:28 AMAlexander Maryanovsky
10/30/2023, 9:21 PMmyanmarking
10/30/2023, 9:24 PMAlexander Maryanovsky
10/30/2023, 9:26 PMshikasd
10/30/2023, 9:27 PMAlexander Maryanovsky
10/30/2023, 9:28 PMmyanmarking
10/30/2023, 9:29 PMmyanmarking
10/30/2023, 9:29 PMAlexander Maryanovsky
10/30/2023, 9:29 PMIndexedColumn {
var index = Section1(firstIndex = 0)
index += Section2(firstIndex = index)
}
Alexander Maryanovsky
10/30/2023, 9:30 PMSection2
in CompositionLocalProvider
myanmarking
10/30/2023, 9:31 PMmyanmarking
10/30/2023, 9:31 PMAlexander Maryanovsky
10/30/2023, 9:32 PMSelectionModel
to know inside the row whether it's currently the "selected" row and draw its background differently (among other things)myanmarking
10/30/2023, 9:33 PMmyanmarking
10/30/2023, 9:33 PMAlexander Maryanovsky
10/30/2023, 9:34 PMmyanmarking
10/30/2023, 9:34 PMAlexander Maryanovsky
10/30/2023, 9:35 PMIndexedColumn {
forEachIndexed(10) {
// 0..9
}
forEachIndexed(10) {
// 0..9 but should be 10..19
}
}
myanmarking
10/30/2023, 9:36 PMAlexander Maryanovsky
10/30/2023, 9:36 PMshikasd
10/30/2023, 9:36 PMmyanmarking
10/30/2023, 9:36 PMshikasd
10/30/2023, 9:38 PMAlexander Maryanovsky
10/30/2023, 9:38 PMmyanmarking
10/30/2023, 9:38 PMmyanmarking
10/30/2023, 9:39 PMAlexander Maryanovsky
10/30/2023, 9:39 PMcontent
lambda is not composable.Alexander Maryanovsky
10/30/2023, 9:39 PMmyanmarking
10/30/2023, 9:39 PMshikasd
10/30/2023, 9:39 PMAlexander Maryanovsky
10/30/2023, 9:40 PMStateFlow
(and remembers some things) to find out what rows it has. Each section is a whole UI...shikasd
10/30/2023, 9:40 PMshikasd
10/30/2023, 9:41 PMAlexander Maryanovsky
10/30/2023, 9:41 PMAlexander Maryanovsky
10/30/2023, 9:41 PMAlexander Maryanovsky
10/30/2023, 9:41 PMAlexander Maryanovsky
10/30/2023, 9:42 PMmyanmarking
10/30/2023, 9:42 PMAlexander Maryanovsky
10/30/2023, 9:43 PMmyanmarking
10/30/2023, 9:45 PMmyanmarking
10/30/2023, 9:45 PMAlexander Maryanovsky
10/30/2023, 9:51 PMColumnWithSelection(
selectionModel = rememberSingleSelectionModel()
) {
DroneSection(dataSource)
ImplantSection(dataSource)
}
@Composable
fun ColumnWithSelectionScope.DroneSection(dataSource: DataSource) {
val drones = dataSource.drones.collectAsState()
for (drone in drones) {
DroneRow(drone)
}
}
@Composable
fun ColumnWithSelectionScope.ImplantSection(dataSource: DataSource) {
val implants = dataSource.implants.collectAsState()
for (implant in implants) {
ImplantRow(implant)
}
}
@Composable
fun ColumnWithSelectionScope.DroneRow(drone: Drone) {
row { ... }
}
@Composable
fun ColumnWithSelectionScope.ImplantRow(implant: Implant) {
row { ... }
}
Alexander Maryanovsky
10/30/2023, 9:53 PM