切换屏幕时Safe Args的参数继续存在的问题

The problem that the Safe Args's argument continues to remain when switching screens

我用Navigation切换屏幕

移动到 bottom Write menuA fragment 屏幕上的 B fragment

在 return 使用 Safe Args 从移动的屏幕 B 返回时也会传递参数。

在这种状态下,如果我移动到 another bottom menu 然后 return 到 Write MenuA 屏幕,Args 将保持原样是。

我不知道为什么要保留 args,但我不想要这个。

当数据来自另一个屏幕时,null来了,我希望代码不被执行。

我希望 A 片段屏幕仅从 B 屏幕接收数据。

为此,我将null设置为nav_gaph中的default value,但这没有意义,因为正在维护args。

请告诉我解决方法和原因!

一个片段

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>

问题不在于维护参数。
但是由于您使用的是 activity 视图模型,因此数据在视图模型中是持久的。

使用这个,

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

变化是我们不再使用安全调用(.?)。
如果不接受 null.

,请对 addRoutine() 进行必要的更改以接受 null