Koin SharedStateViewModel - SavedStateHandle 设置为 null

问题描述 投票:0回答:1

所以在我的应用程序中,我将 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,它工作得很好。任何想法将不胜感激!

android kotlin android-viewmodel koin
1个回答
0
投票

尝试升级到最新的Koin版本,看到这个问题:https://github.com/InsertKoinIO/koin/issues/1386

© www.soinside.com 2019 - 2024. All rights reserved.