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

#android #kotlin #android-navigation #android-safe-args

Вопрос:

Я использую Navigation для переключения экранов.

Переместитесь B fragment на A fragment экран bottom Write menu .

Аргументы также передаются при возврате с помощью Safe Args перемещенного экрана B .

В этом состоянии, если я перейду к another bottom menu экрану , а затем вернусь к A Write Menu нему, Args сохраняется как есть.

Я не знаю, почему сохраняются аргументы, но я этого не хочу.

Когда данные поступают с другого экрана, null приходит, и я хочу, чтобы код не выполнялся.

Я хочу A , чтобы экран фрагмента получал данные только с B экрана.

Для этого я задаю null как default value вход nav_gaph , но это не имеет смысла , потому что аргументы поддерживаются.

Пожалуйста, скажите мне решение и почему!

Фрагмент

 class WriteRoutineFragment : Fragment() {
    private var _binding : FragmentWriteRoutineBinding? = null
    private val binding get() = _binding!!
    private lateinit var adapter : RoutineAdapter
    private val args : WriteRoutineFragmentArgs by navArgs()
    private val vm : WriteRoutineViewModel by activityViewModels { WriteRoutineViewModelFactory() }

    override fun onCreateView(inflater: LayoutInflater,
                              container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        _binding = FragmentWriteRoutineBinding.inflate(inflater, container, false)

        adapter = RoutineAdapter(::addDetail, ::deleteDetail)
        binding.rv.adapter = this.adapter
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        args.workout?.let { workout -> // here!! args is maintained..
            vm.addRoutine(workout)
        }

        vm.items.observe(viewLifecycleOwner) { updatedItems ->
            adapter.setItems(updatedItems)
        }
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
}
 

nav_graph.xml

 <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/write_routine_home"
    app:startDestination="@id/writeRoutineHome">

    <fragment
        android:id="@ id/writeRoutine"
        android:name="com.example.lightweight.fragment.WriteRoutineFragment"
        android:label="fragment_write_routine"
        tools:layout="@layout/fragment_write_routine" >
        <action
            android:id="@ id/action_writeRoutineFragment_to_workoutListTabFragment"
            app:destination="@id/workoutListTabFragment" />
        <argument
            android:name="workout"
            app:argType="string"
            app:nullable="true"
            android:defaultValue="@null"/>
    </fragment>
</navigation>
 

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

1. Вопрос не очень ясен. Из того, что я понял, я сделал образец репо для вашей справки. github.com/Abhimanyu14/navigation-demo . Проверьте это и подтвердите, решает ли это вашу проблему. Если нет, пожалуйста, внесите больше ясности в этот вопрос.

2. тх. спасибо. Но мой код использует activityviewmodels. Таким образом, даже если вы переключитесь на другой экран, полученные данные будут продолжать существовать, а не будут пустыми. я не хочу этого…

3. ОК. Понял. Проверьте, поможет ли мой ответ.

Ответ №1:

Проблема не в том, что аргументы поддерживаются.
Но поскольку вы используете модели представления активности, данные сохраняются в модели представления.

Используйте это,

 args.workout.let { workout -> // here!! args is maintained..
    vm.addRoutine(workout)
}
 

Изменение заключается в том, что мы больше не используем безопасные вызовы ( .? ).
Внесите необходимые изменения, addRoutine() чтобы принять null значения, если они не принимаются null .