【发布时间】:2020-12-24 09:31:30
【问题描述】:
我有两个选项可以在片段之间传递数据,导航的安全参数和视图模型的 SavedStateHandle,它们之间有什么区别以及如何在正确的位置使用它们?
【问题讨论】:
标签: android performance parameter-passing
我有两个选项可以在片段之间传递数据,导航的安全参数和视图模型的 SavedStateHandle,它们之间有什么区别以及如何在正确的位置使用它们?
【问题讨论】:
标签: android performance parameter-passing
关于这个问题的讨论很少。 android ViewModelFactory with hilt https://issuetracker.google.com/issues/136967621
对我来说,最明显的解决方案是使用类似
SafeArgs.fromSavedStateHandle(savedStateHandle)
但现在,我使用的是字符串键。
【讨论】:
MyFragmentArgs.fromSavedStateHandle(savedStateHandle) 自安全参数 2.4.0 起可用
2.4.0-rc01 如果更正确,还没有稳定版本developer.android.com/jetpack/androidx/releases/…
如果您使用 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")
}
}
然后像使用安全参数一样使用它
class FooViewModel @ViewModelInject constructor(
@Assisted savedStateHandle: SavedStateHandle
) : ArgsViewModel(savedStateHandle) {
private val args: FooFragmentArgs by navArgs()
}
【讨论】:
Bundle(args)。在我们的例子中,有人明确地将args 放入args。那你的回答就OK了。