Search code examples
androidkotlinandroid-jetpack-composeandroid-jetpack

Reuse @Composable container for a list of items


data class object1()

data class object2()

In my @Composable screen I have 2 tabs, every single display a list with items.

when (tabToDisplay) {
    TabCategory.1-> Section1(list = listOf<object1>())
    TabCategory.2-> Section2(list = listOf<object2>())
}

@Section1 and @Section2 is the same composable with

 Column(){
    list.forEach {
       UiItem1()
   //or
       UiItem2()
    }
}

The only difference inside is the type of item I'm creating.

Question: How I can simplify my code to have only 1 @Composable section for my list object


Solution

  • You can add a generic parameter and a content builder to your Section:

    @Composable
    fun<T> Section(list: List<T>, itemContent: @Composable (T) -> Unit) {
        Column(){
            list.forEach {
                itemContent(it)
            }
        }
    }
    

    Then you can it like this:

    when (tabToDisplay) {
        TabCategory.1 -> {
            Section(list = listOf<Object1>()) {
                UiItem1(it)
            }
        }
        TabCategory.2 -> {
            Section(list = listOf<Object2>()) {
                UiItem2(it)
            }
        }
    }
    

    p.s. according to kotlin style guide, classes should be named in PascalCase. When you get used to this, it will increase your development speed because your eye will more easily identify the variable/class in your code. It is also required in most development commands, so it is better to get used to it right away.