Vous devriez avoir quelque chose comme ça:

class ComposeActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //...
        setContent {
            TodoTheme {
                ListScreen()
            }
        }
    }
}
LazyColumn{
    items(100) {
        Text(text = "Item #$it")
    }
}

On va maintenant ajouter un peu d'interactivité sur notre liste.

var items by remember { mutableStateOf(List(100) { "Item #$it" }) }
items(items) { task ->
  Column {
    Text(text = task.title)
    Text(text = task.description)
  }
}

On va utiliser des éléments de "Material Design 3" pour améliorer un peu l'interface facilement.

Scaffold(
    modifier = Modifier.fillMaxSize(),
    topBar = { TopAppBar(title = { Text(/* title */) }) },
    floatingActionButton = {
        FloatingActionButton(onClick = { /* TODO */ }) {
          Icon(imageVector = Icons.Default.Add, contentDescription = "Add")
        }
    }
) {
    LazyColumn() {
        // ...
    }
}

On va maintenant implémenter l'ajout d'éléments à la liste.

onClick = {
    val newItem = Task(title = "Item #${items.size}")
    items = items + newItem
}
coroutineScope.launch {
  // suspend function
}

Ajoutez un bouton de suppression dans chaque élément et faites sorte qu'il fonctionne Pour avoir un item avec le texte à gauche et le bouton tout à droite vous pouvez utiliser une Row avec horizontalArrangement = Arrangement.SpaceBetween ou bien un Spacer(modifier = Modifier.weight(1f)) entre les 2 éléments.

On va d'abord permettre de naviguer vers notre ancienne MainActivity:

IconButton(onClick = {...}) {
  Icon(
      imageVector = Icons.AutoMirrored.Filled.ArrowForward,
      contentDescription = "go to classic app"
  )
}
val intent = Intent(context, MainActivity::class.java)
context.startActivity(intent)

Pour récupérer un Context on utilise un CompositionLocal:

val context = LocalContext.current

Maintenant on va utiliser la bibliothèque Navigation3 pour gérer la navigation de manière plus propre:

@Serializable
data object ListNavScreen : NavKey
@Serializable
data class DetailNavScreen(val task: Task) : NavKey

@Composable
fun App() {
    // on créé notre historique de navigation avec la liste comme écran initial
    val backStack = rememberNavBackStack(ListNavScreen)

    NavDisplay(
      backStack = backStack,
      entryProvider = entryProvider {
        entry<ListNavScreen> { ListScreen(onClickItem = {...}) }
        entry<DetailNavScreen> { key -> DetailScreen(task = key.task) }
      }
    )
}
@Composable
private fun TaskItem(
    modifier: Modifier = Modifier,
    item: Task,
    onClick: (Task) -> Unit,
    onDelete: () -> Unit,
) {...}
// Pour naviguer vers l'écran détail, on l'ajoute à l'historique:
backStack.add(DetailNavScreen(...))
// Pour revenir en arrière, on enlève le dernier écran de l'historique:
backStack.removeLastOrNull()