如何使用 Dagger Hilt 将导航参数传递到 ViewModel 中?

How to pass navigation argument into ViewModel using Dagger Hilt?

提问人:xephosbot 提问时间:11/8/2023 更新时间:11/8/2023 访问量:26

问:

我有一个由两个 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。

Android 匕首-刀柄 android-architecture-navigation

评论


答:

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