#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
.