package com.example.cv04navicomplex import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.material3.Button import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import com.example.cv04navicomplex.ui.theme.CV04NAVIComplexTheme /* Komplexnější ukázka, kde je HomeScreen obrazovka (Composable) a z ní je možné se dostat do dalších obrazovek: SecondScreen, ThirdScreen SecondScreen je navíc v textovém poli upraven text (sharedText), který je zpět předán do HomeScreen. Princip toku dat: - sharedText žije v MainActivity vedle navControlleru. - HomeScreen hodnotu pouze pasivně čte a zobrazuje. - SecondScreen obdrží initialText, uživatel hodnotu přepíše v OutlinedTextField a po kliknutí na tlačítko zavolá onSaveAndBack(textInput), čímž se hodnota pošle nahoru a obrazovka se zavře. */ class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContent { CV04NAVIComplexTheme { val navController = rememberNavController() // Stav je držen na nejvyšší úrovni kompozice (State Hoisting) var sharedText by remember { mutableStateOf("Výchozí text") } Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> NavHost( navController = navController, startDestination = "home", modifier = Modifier.padding(innerPadding) ) { // Hlavní obrazovka přijímá stav pro zobrazení composable("home") { HomeScreen( textToDisplay = sharedText, onNavigateToSecond = { navController.navigate("screen2") }, onNavigateToThird = { navController.navigate("screen3") } ) } // Druhá obrazovka dostává výchozí hodnotu a callback s novou hodnotou composable("screen2") { SecondScreen( initialText = sharedText, onSaveAndBack = { updatedText -> // Hodnota je uložena a je proveden návrat na rozcestník sharedText = updatedText navController.popBackStack() } ) } composable("screen3") { ThirdScreen( onBack = { navController.popBackStack() } ) } } } } } } } @Composable fun HomeScreen( textToDisplay: String, modifier: Modifier = Modifier, onNavigateToSecond: () -> Unit, onNavigateToThird: () -> Unit ) { Column(modifier = modifier) { Text("Hlavní rozcestník") Text("Hodnota: $textToDisplay") Button(onClick = onNavigateToSecond) { Text("Přejít na druhou obrazovku") } Button(onClick = onNavigateToThird) { Text("Přejít na třetí obrazovku") } } } @Composable fun SecondScreen( initialText: String, modifier: Modifier = Modifier, onSaveAndBack: (String) -> Unit ) { // Pro úpravu v textovém poli je vytvořen lokální stav var textInput by remember { mutableStateOf(initialText) } Column(modifier = modifier) { Text("Druhá obrazovka") OutlinedTextField( value = textInput, onValueChange = { textInput = it }, label = { Text("Zadejte hodnotu") } ) // Po stisku je nová hodnota předána zpět Button(onClick = { onSaveAndBack(textInput) }) { Text("Uložit a zpět") } } } @Composable fun ThirdScreen(modifier: Modifier = Modifier, onBack: () -> Unit) { Column(modifier = modifier) { Text("Třetí obrazovka") Button(onClick = onBack) { Text("Zpět na rozcestník") } } }