所以在我的应用程序中,我将 Koin 用于 DI。有问题的应用程序是一个简单的笔记应用程序,有 2 个主要片段:NotesFragment,显示所有笔记和 InsertNoteFragment,用于插入新笔记或更新现有笔记。 InsertNoteFragment 有一个 sharedViewModel,它与 BottomSheetDialogFragment 共享,我用它来为新笔记选择样式。
现在,当我在 NotesFragment 中点击一个笔记时,我想在 InsertNoteFragment 中打开,这样它就可以被更新。导航到笔记看起来像这样:
notesAdapter.setOnItemClickListener { note ->
note.id?.let { id ->
findNavController().navigate(
NotesFragmentDirections.actionNotesFragmentToInsertNotesFragment(noteId = id)
)
}
当我调试这段代码时,它显示,onClick id 值对应于笔记的 ID 值,所以这里一切都很好。我作为导航参数发送的 ID 值应该保存在我注入 InsertNoteViewModel 的 SavedStateHandle 中(在 InsertNoteFragment 和 BottomSheetDialogFragment 之间共享的那个)
class InsertNotesViewModel(
private val insertNoteUseCase: InsertNoteUseCase,
private val loadOneItemUseCase: LoadOneItemUseCase,
savedStateHandle: SavedStateHandle): ViewModel() {
private val _noteState = MutableStateFlow(Note())
val noteState: StateFlow<Note> = _noteState.asStateFlow()
init {
println("ID ${savedStateHandle.get<Int>("noteId")}")
savedStateHandle.get<Int>("noteId")?.let {
if(it != 0){
loadOneItem(it)
}
}
}
ViewModel 注入 Koin:
viewModel{ params ->
InsertNotesViewModel(get(), get(), params.get())
}
使用 sharedStateViewModel 的 InsertNoteFragment 和 BottomSheetDialogFragment(如 Koin 文档中所建议的:https://insert-koin.io/docs/reference/koin-android/viewmodel/)
private val viewModel by sharedStateViewModel<InsertNotesViewModel>()
问题是 SavedStateHandle id 值每次都为空。我尝试不使用惰性委托注入(使用 getSharedStateViewModel()),但结果是一样的。在使用 Hilt 之前,我一直为此目的使用 SavedStateHandle,它工作得很好。任何想法将不胜感激!
尝试升级到最新的Koin版本,看到这个问题:https://github.com/InsertKoinIO/koin/issues/1386