切换屏幕时Safe Args的参数继续存在的问题
The problem that the Safe Args's argument continues to remain when switching screens
我用Navigation
切换屏幕
移动到 bottom Write menu
的 A fragment
屏幕上的 B fragment
。
在 return 使用 Safe Args
从移动的屏幕 B
返回时也会传递参数。
在这种状态下,如果我移动到 another bottom menu
然后 return 到 Write Menu
的 A
屏幕,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
值
我用Navigation
切换屏幕
移动到 bottom Write menu
的 A fragment
屏幕上的 B fragment
。
在 return 使用 Safe Args
从移动的屏幕 B
返回时也会传递参数。
在这种状态下,如果我移动到 another bottom menu
然后 return 到 Write Menu
的 A
屏幕,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
值