提问人:xephosbot 提问时间:11/8/2023 更新时间:11/8/2023 访问量:26
如何使用 Dagger Hilt 将导航参数传递到 ViewModel 中?
How to pass navigation argument into ViewModel using Dagger Hilt?
问:
我有一个由两个 List-Detail 片段组成的 Single Activity App
我的导航功能如下所示:
private fun navigateToDetail(noteId: String?, transitionView: View) {
val action = NotesFragmentDirections.actionNotesFragmentToNoteDetailFragment(
noteId,
transitionView.transitionName
)
val extras = FragmentNavigatorExtras(transitionView to transitionView.transitionName)
findNavController().navigate(action, extras)
}
这是我在 DetailFragment 中的 ViewModel:
@HiltViewModel
class DetailViewModel @Inject constructor(
private val savedStateHandle: SavedStateHandle
) : ViewModel() {
private val _state: MutableStateFlow<DetailState> = MutableStateFlow(DetailState())
val state: StateFlow<DetailState> = _state.asStateFlow()
init {
savedStateHandle.get<String>("note_id")?.let { noteId ->
getNote(noteId.toLong())
}
}
...
}
我有 2 种情况,要么我发送一个 ID 作为参数,在这种情况下,部分片段被填充。 或者我发送 null 以打开一个空的零件屏幕。但是由于某种原因,在 savedStateHandle 中,该值始终为 null。
答:
0赞
ΓDΛ
11/8/2023
#1
很难从您的代码中理解。但是,我可以展示一个示例用法。structure
SharedViewModel
class SharedViewModel(private val stateHandle: SavedStateHandle) : ViewModel() {
var data = stateHandle.getLiveData<String>("key")
}
片段A
findNavController().currentBackStackEntry?.savedStateHandle?.set("key", data)
findNavController().navigate(R.id.fragmentB)
片段B
sharedViewModel.data.observe(viewLifecycleOwner, Observer {
})
注意
private val sharedViewModel: SharedViewModel by activityViewModels()
评论
0赞
xephosbot
11/8/2023
是否必须使用 SharedViewModel 方法?因为我目前对每个片段使用单独的 ViewModel。我认为 SaveArgs 插件会自动将传递的参数转换为 Bundle,这些参数被传递给初始化 Dagger Hilt 的 savedStateHandle
0赞
ΓDΛ
11/8/2023
可以使用 SavedStateHandle 对其进行管理。但替代 stackoverflow.com/questions/63752526/......
评论