如何使用SavedStateHandle和导航安全参数



我有两个选项在片段之间传递数据,导航的安全参数和viewModel的SavedStateHandle,它们之间有什么区别,以及如何在正确的地方使用它们?

关于这个问题的讨论很少。android ViewModelFactory与手柄https://issuetracker.google.com/issues/136967621

对我来说,最明显的解决方案是使用类似的东西

SafeArgs.fromSavedStateHandle(savedStateHandle)

但目前,我使用的是字符串键。

如果您使用hilt,您可以像一样将传入的参数包装在片段(和其他组件(中

open class BaseFragment : Fragment() { // Inherit your fragment from this
override fun setArguments(args: Bundle?) {
if (args != null) {
if (args.getBundle(BUNDLE_ARGS) != null) {
super.setArguments(args)
} else {
super.setArguments(Bundle(args).apply {
putBundle(BUNDLE_ARGS, args) // Wrap the arguments as BUNDLE_ARGS
})
}
} else {
super.setArguments(null)
}
}
}

然后对于视图模型,您可以继承类似的东西

open class ArgsViewModel(private val savedStateHandle: SavedStateHandle) : ViewModel() {
val arguments get() = savedStateHandle.get<Bundle>(BUNDLE_ARGS)
@MainThread
inline fun <reified Args : NavArgs> navArgs() = NavArgsLazy(Args::class) {
arguments ?: throw IllegalStateException("ViewModel $this has null arguments")
}
}

然后像使用安全args 一样使用它

class FooViewModel @ViewModelInject constructor(
@Assisted savedStateHandle: SavedStateHandle
) : ArgsViewModel(savedStateHandle) {
private val args: FooFragmentArgs by navArgs()
}

最新更新