为什么从导航组件版本 1.0.0-alpha09 中删除了 addDefaultArguments()?什么是 WorkAround 将 arg 从 Activity 传递到 StartDestination?

Anm*_*mol 4 android android-jetpack android-architecture-navigation

您好,我正在研究导航架构组件,并以编程方式为我的活动设置 NavHostFragment。

主活动.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>
Run Code Online (Sandbox Code Playgroud)

MainActivity.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
    }
}
Run Code Online (Sandbox Code Playgroud)

问题

我长时间使用上面的代码,但我在下面的代码行中更新了我的 gradle 依赖版本android.arch.navigation:navigationfrom 1.0.0-alpha08to1.0.0-alpha09和 after update 我收到编译时错误:

代码:

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

错误:

未解决的参考:addDefaultArguments

依赖项(项目等级文件)

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}
}
Run Code Online (Sandbox Code Playgroud)

当我恢复到导航版本时,1.0.0-alpha08一切正常。出于某种原因,谷歌已经从alpha09 版本的NavDestination中删除了 addDefaultArguments 。

任何人都知道为什么删除 addDefaultArguments 方法?

更新:

什么是 WorkAround 将 arg 从 Activity 传递到 StartDestination?

检查线程以获取有关问题的更多详细信息基本上我想找到一种方法将参数从托管导航片段的活动发送到我的 startDestination。

1.0.0-alpha09之前:

我发现的唯一解决方案是使用addDefaultArguments()

之后1.0.0-alpha09 不知道???

如果有任何解决此问题的方法请分享!

Ale*_*lex 5

我检查了源代码,发现导航目的地和参数有很多变化。我认为将默认参数传递给导航图的正确方法是这样的:

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
Run Code Online (Sandbox Code Playgroud)

也许有更好的方法,但我没有找到。