Как отправить необязательные аргументы в текстовые поля на другом экране, используя навигацию по созданию реактивного ранца

Я пытался сделать приложение для заметок с базой данных комнаты и рукоятью кинжала. Все работало отлично, пока я не перешел к передаче аргументов с главного экрана на экран заметок, используя навигацию при составлении, где пользователь может редактировать текст и обновлять его. Но по какой-то причине аргументы не передаются правильно в textFields.

Думая, что проблема связана с комнатой или рукоятью, я упростил проект, попытавшись передать две строки в два разных текстовых поля на экране заметки, но проблема не устранена. Когда я передал «примечание» и «контент» двум текстовым полям на экране заметок, первое текстовое поле, которое должно получить «примечание», просто отображает значение по умолчанию из navArgument в NavGraph, а второе отображает это {note_content}notecontent. похоже, что второй texField получает оба аргумента. Это мой код. пожалуйста, помогите

Основное действие и главный экран

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            NavigationTutsProjectTheme {
                // A surface container using the 'background' color from the theme
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colors.background
                ) {
                    Navigation()
                }
            }
        }
    }
}

@Composable
fun HomeScreen(navController: NavController){
    val textTitle = "note"
    val textContent = "content"
    Column(
        modifier = Modifier
            .fillMaxSize()
            .clickable {
                navController.navigate(Screen.NoteScreen.route+textTitle+textContent)
            },
        horizontalAlignment = Alignment.CenterHorizontally,
        verticalArrangement = Arrangement.Center
    ) {
        Text(text = textTitle)
        Text(text = textContent)
    }
}

Маршруты для Home и NoteScreen с аргументами

sealed class Screen(val route: String){
    object HomeScreen: Screen("home_screen")
    object NoteScreen: Screen("note_screen?note_title = {note_title}&note_content = {note_content}")
}

Навигационная система

@Composable
fun Navigation(){
    val navController = rememberNavController()
    
    NavHost(navController = navController, startDestination = Screen.HomeScreen.route){
        composable(route = Screen.HomeScreen.route){
            HomeScreen(navController)
        }
        composable(
            route =Screen.NoteScreen.route,
            arguments = listOf(
                navArgument("note_title"){
                    type = NavType.StringType
                    defaultValue = "Nothing"
                },
                navArgument("note_title"){
                    type = NavType.StringType
                    defaultValue = "Nothing"
                }
            )
        ){entry->
            NoteScreen(
                noteTitle = entry.arguments?.getString("note_title"),
                noteContent = entry.arguments?.getString("note_content")
            )
        }
    }
}

Экран заметок

@Composable
fun NoteScreen(
    noteTitle: String?,
    noteContent: String?
){
    var textFieldTitle by remember {
        mutableStateOf(noteTitle)
    }
    var textFieldContent by remember {
        mutableStateOf(noteContent)
    }
    Column(
        modifier = Modifier
            .fillMaxSize()
    ) {
        textFieldTitle?.let {
            TextField(
                value = it, onValueChange = {it2->
                    textFieldTitle = it2
                }
            )
        }
        textFieldContent?.let {
            TextField(
                value = it, onValueChange = {it2->
                    textFieldContent = it2
                }
            )
        }
    }
}

Вот что я получаю, когда запускаю код

введите здесь описание изображения

Ваш код Screen.NoteScreen.route+textTitle+textContent просто объединяет строки вместе. Вы ожидали, что + заменит {note_title} вашей переменной textTitle и {note_content} вашей переменной textContent? Это не то, что делает +.

ianhanniballake 18.04.2023 21:38

да, это то, что я пытался сделать. как заставить его работать?

lines 19.04.2023 14:43
1
2
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пытаться

Screen.NoteScreen.route.replace("{note_title}",textTitle).replace("{note_content}" ,textContent)

вместо

Screen.NoteScreen.route+textTitle+textContent

Другие вопросы по теме