[ ] Adicionar o plugin e a dependência do kotlinx serialization com Json
[versions]
...
kotlinxSerialization = "1.7.1"
[libraries]
...
kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinxSerialization" }
plugins {
...
kotlin("plugin.serialization") version libs.versions.kotlin
}
dependencies {
...
// Room
...
// Navigation
...
// Lifecycle
...
// Dagger Hilt
...
// Kotlinx Serialization
implementation(libs.kotlinx.serialization.json)
...
}
[ ] Criar o pacote navigation dentro do pacote principal e criar o NavHost
@Serializable
object ListRoute
@Serializable
data class AddEditRoute(val id: Long? = null)
@Composable
fun TodoNavHost() {
val navController = rememberNavController()
NavHost(navController = navController, startDestination = ListRoute) {
composable<ListRoute> {
ListScreen()
}
composable<AddEditRoute> { backStackEntry ->
val addEditRoute = backStackEntry.toRoute<AddEditRoute>()
AddEditScreen()
}
}
}
[ ] Adicionar as ações na tela de Listagem para redirecionar para a tela de adicionar/editar
@Composable
fun ListScreen(
navigateToAddEditScreen: (id: Long?) -> Unit,
) {
ListContent(
todos = emptyList(),
onAddItemClick = {
navigateToAddEditScreen(null)
}
)
}
@Composable
fun ListContent(
todos: List<Todo>,
onAddItemClick: () -> Unit,
) {
Scaffold(
floatingActionButton = {
FloatingActionButton(
onClick = {
onAddItemClick()
}
) {
Icon(imageVector = Icons.Filled.Add, contentDescription = "Add")
}
}
) {
...
}
}
@Preview
@Composable
private fun ListContentPreview() {
TodoListBaseTheme {
ListContent(
todos = listOf(
todo1,
todo2,
todo3,
),
onAddItemClick = {},
)
}
}
[ ] Ajustar NavHost e navegar para a tela de adicionar/editar
...
@Composable
fun TodoNavHost() {
...
NavHost(navController = navController, startDestination = ListRoute) {
composable<ListRoute> {
**ListScreen(
navigateToAddEditScreen = { id ->
navController.navigate(AddEditRoute(id))
}
)**
}
...
}
}
[ ] Chamar o NavHost na Activity
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
TodoListBaseTheme {
**TodoNavHost()**
}
}
}
}
[ ] Executar o aplicativo e verficar que a tela de adicionar/editar ficou com o conteúdo atrás da status bar por causa da feature edge to edge do Android. Como nosso aplicativo nao precisa fazer uso edge to edge, podemos ajustar para utilizar a penas a área segura
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
TodoListBaseTheme {
**Box(modifier = Modifier.safeDrawingPadding()) {
TodoNavHost()
}**
}
}
}
}