Проблема с безопасными аргументами навигационного компонента в Навигационном ящике

#android #navigation #navigation-drawer #android-safe-args

Вопрос:

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

1.Фрагмент Дома

2.Фрагмент Продукта

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

Проблема :-

Из фрагмента поиска, когда я нажимаю на кнопку, он вернется к фрагменту дома с поисковым запросом в качестве безопасного аргумента, это работает нормально, но после получения аргумента в фрагменте дома, затем, когда я открою фрагмент продукта с помощью навигационного ящика и нажму кнопку «Назад», поисковый запрос снова будет отправлен в фрагмент дома

Мой Код :-

nav_graph.xml

 <?xml version="1.0" encoding="utf-8"?>
<navigation 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:id="@ id/nav_graph"
   app:startDestination="@id/homeFragment">

   <fragment
       android:id="@ id/homeFragment"
       android:name="com.example.navigation.HomeFragment"
       android:label="fragmnet_home"
       tools:layout="@layout/fragmnet_home">
         <argument
           android:name="query"
           app:argType="string"
           app:nullable="true"
           android:defaultValue="@null" />
   </fragment>

   <fragment
       android:id="@ id/searchFragment"
       android:name="com.example.navigation.SearchFragment"
       android:label="fragment_search"
       tools:layout="@layout/fragment_search" >
       <action
           android:id="@ id/action_searchFragment_to_homeFragment"
           app:destination="@id/homeFragment" />
   </fragment>

   <action android:id="@ id/action_global_searchFragment" app:destination="@id/searchFragment" />
   <fragment
       android:id="@ id/productFragment"
       android:name="com.example.navigation.ProductFragment"
       android:label="fragment_product"
       tools:layout="@layout/fragment_product" />
 </navigation>
 

Основная активность.тыс. т

 class MainActivity : AppCompatActivity() {

   private lateinit var mainBinding : ActivityMainBinding
   private lateinit var mNavController : NavController
   private lateinit var appBarConfiguration: AppBarConfiguration
   override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
       mainBinding = ActivityMainBinding.inflate(layoutInflater)
       setContentView(mainBinding.root)

       appBarConfiguration = AppBarConfiguration(
        setOf(R.id.homeFragment),
        mainBinding.drawerLayout
    )
       val navHost = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
       mNavController = navHost.findNavController()
       setSupportActionBar(mainBinding.toolbar)
       setupActionBarWithNavController(mNavController,appBarConfiguration)
       mainBinding.navView.setupWithNavController(mNavController)
   }

   override fun onSupportNavigateUp(): Boolean {
       return mNavController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
   }
 }
 

HomeFragment.kt

 class HomeFragment : Fragment(R.layout.fragmnet_home) {

    private lateinit var homeBinding  : FragmnetHomeBinding
    private val arguments : HomeFragmentArgs by navArgs()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        homeBinding = FragmnetHomeBinding.bind(view)

    
        if(!arguments.query.isNullOrEmpty()){
            Toast.makeText(context, "${arguments.query}", Toast.LENGTH_SHORT).show()
        }
    
        homeBinding.btnSearch.setOnClickListener {
            val destination = HomeFragmentDirections.actionGlobalSearchFragment()
            findNavController().navigate(destination)
        }
    }
}
 

Фрагмент поиска.kt

 class SearchFragment : Fragment() {

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val binding = FragmentSearchBinding.bind(view)
    
        binding.search.setOnClickListener {
            val query = binding.query.text.toString()
            val action = SearchFragmentDirections.actionSearchFragmentToHomeFragment(query)
            findNavController().navigate(action)

        }

    }
}
 

Фрагмент продукта.кт

 class ProductFragment : Fragment(R.layout.fragment_product) {

    private lateinit var productBinding  : FragmentProductBinding

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        productBinding = FragmentProductBinding.bind(view)
    
        productBinding.btnSearch.setOnClickListener {
            val action  = ProductFragmentDirections.actionGlobalSearchFragment()
            findNavController().navigate(action)
        }
    }
}
 

изображение nav_graph

заранее спасибо

Комментарии:

1. Это похоже на ожидаемое поведение backstack, поскольку начальный фрагмент является вашим начальным пунктом назначения, не могли бы вы подробнее рассказать об ожидаемом поведении?

2. По умолчанию, когда я открываю фрагмент home, он будет извлекать некоторые данные в зависимости от местоположения пользователя, и когда я выполняю операцию поиска, фрагмент home покажет результат на основе поискового запроса….после того, как я выполню поиск и перейду к фрагменту продукта и нажму «Назад», в основном я получаю результат поискового запроса, не основанный на местоположении пользователя

3. Если вам визуализировать стек переходов назад в результате навигационной было бы — Главная —> Поиск —> Главная (при запросе) —> продукта, так, естественно, назад нажмите оставит вас в предыдущее состояние дома фрагмент, вы можете изменить свой дизайн и использовать popUpTo в своем действии на продукт фрагмент так, что стек является домом —> Поиск —> продукт