Почему addDefaultArguments () удален из компонента навигации версии 1.0.0-alpha09? Что такое WorkAround для передачи аргумента в StartDestination из Activity?

Здравствуйте, я работаю над компонентом архитектуры навигации и программно настраиваю NavHostFragment для моей деятельности.

MainActivity.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <fragment
        android:id="@+id/nav_host"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
     />
</android.support.constraint.ConstraintLayout>

MainActiviy.kt:

package com.andor.navigate.demonavigation

import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import androidx.navigation.Navigation
import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.ui.NavigationUI
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        setupNavigation()
        NavigationUI.setupActionBarWithNavController(this, NavHostFragment.findNavController(nav_host))

    }

    override fun onSupportNavigateUp(): Boolean = Navigation.findNavController(
        this,
        R.id.nav_host
    ).navigateUp()

    private fun setupNavigation() {
        val navHostFragment = nav_host as NavHostFragment
        val navController = navHostFragment.navController
        val navInflater = navController.navInflater
        val graph = navInflater.inflate(R.navigation.nav_graph)
        graph.addDefaultArguments(intent!!.extras!!) // This is where you pass the bundle data from Activity to StartDestination
        navHostFragment.navController.graph = graph
    }
}

Проблема:

Я использую приведенный выше код в течение длительного времени, но я обновил свою версию зависимости gradle android.arch.navigation:navigation с 1.0.0-alpha08 до 1.0.0-alpha09, и после обновления в приведенной ниже строке кода я получаю ошибку времени компиляции:

код:

graph.addDefaultArguments(intent!!.extras!!) // This is where you pass the bundle data from Activity to StartDestination

ошибка:

Неразрешенная ссылка: addDefaultArguments

зависимость (файл Gradel проекта):

dependencies {

    def nav_version = "1.0.0-alpha09"

    implementation "android.arch.navigation:navigation-fragment:$nav_version" // use -ktx for Kotlin
    implementation "android.arch.navigation:navigation-ui:$nav_version" // use -ktx for Kotlin}
}

Когда я вернусь к версии навигации 1.0.0-alpha08, все работает нормально. По какой-то причине Google удалил аргументы addDefaultArguments из NavDestination в версии alpha09.

Кто-нибудь знает, почему удален метод addDefaultArguments?

ОБНОВЛЕНИЕ:

Что такое WorkAround для передачи аргумента в StartDestination из Activity?

Проверьте ветку для получения более подробной информации по вопросу, в основном я хочу найти способ отправить аргумент в мой startDestination из моей активности, на которой размещен Фрагмент навигации.

До 1.0.0-alpha09:

Я могу найти только Решение, использующее addDefaultArguments()

после 1.0.0-alpha09 не знаю ???

Если есть какое-либо решение этой проблемы, поделитесь!


person Anmol    schedule 26.12.2018    source источник
comment
Имеет ли значение почему? Они удалили его ... по-видимому, по уважительной причине ... так что вам просто нужно разобраться с этим. И обратите внимание, что альфа-API может измениться. Это одно из свойств альфа-версии.   -  person Stephen C    schedule 29.12.2018
comment
да, это важно, я использую его для решения этой stackoverflow.com/q/53913648/7972699 у вас есть другой способ решить эту проблему ?? Я не могу найти другого способа сделать то же самое. @StephenC   -  person Anmol    schedule 29.12.2018
comment
Это не то, что вы задали в своем вопросе. Вы спросили, почему они его удалили. Если вы хотели спросить не это, вам следует отредактировать свой вопрос, чтобы удалить не относящийся к делу материал (и вводящий в заблуждение заголовок), и задать вопросы, на которые вы хотите получить ответы.   -  person Stephen C    schedule 29.12.2018
comment
Кроме того, вы НЕ объяснили, почему это важно для вас, почему они удалили его   -  person Stephen C    schedule 29.12.2018
comment
@StephenC Я добавлю дополнительную информацию к вопросу, но мой заголовок вопроса правильный. Я хочу знать, почему он был удален, поскольку он был там до версии 08, и внезапно его удалили. Я не буду менять заголовок, но добавлю подробности, почему я хочу это знать   -  person Anmol    schedule 29.12.2018
comment
В таком случае мой первоначальный комментарий остается в силе. Вам не нужно знать ... потому что знание не поможет вам решить вашу проблему. Но если вы действительно хотите знать, найдите репозиторий исходного кода и просмотрите историю класса. Определите фиксацию, в которой метод был удален из API, и прочтите сообщение фиксации и связанную информацию для отслеживания проблем.   -  person Stephen C    schedule 29.12.2018
comment
Хорошо, я хорошо понял вашу точку зрения, я попробую найти решение проблемы "Почему?" и опубликуйте его здесь, а также о том, как решить мою проблему, я обновлю в своем вопросе. @StephenC   -  person Anmol    schedule 29.12.2018
comment
Вот рекомендуемый подход: stackoverflow.com/a/57607441/3036824   -  person Praveen Singh    schedule 22.08.2019


Ответы (1)


Я проверил исходный код и увидел, что есть много изменений, касающихся пункта назначения и аргументов навигации. Я думаю, что правильный способ передать аргументы по умолчанию в граф навигации примерно так:

val navHostFragment = nav_host as NavHostFragment
val navController = navHostFragment.navController
val navInflater = navController.navInflater
val graph = navInflater.inflate(R.navigation.nav_graph)
if(intent.extras!=null) {
    val argument1 = intent.extras.get("Key1")
    val argument2 = intent.extras.get("Key1")
    val navArgument1=NavArgument.Builder().setDefaultValue(argument1).build()
    val navArgument2=NavArgument.Builder().setDefaultValue(argument2).build()
    graph.addArgument("Key1",navArgument1)
    graph.addArgument("Key2",navArgument2)
}
navHostFragment.navController.graph = graph

Может быть, есть способ получше, но я его не нашел.

person Alex    schedule 30.12.2018