Android 使用Koin和navArgs在childfragment中获取sharedviewmodel
我有一个片段,它基本上只包含一个底部导航和一个视图模型。该视图模型由该片段中的所有子片段共享。我的parentfragment看起来有点像这样:Android 使用Koin和navArgs在childfragment中获取sharedviewmodel,android,android-fragments,viewmodel,koin,Android,Android Fragments,Viewmodel,Koin,我有一个片段,它基本上只包含一个底部导航和一个视图模型。该视图模型由该片段中的所有子片段共享。我的parentfragment看起来有点像这样: class UserDetailFragment : Fragment() { private val args: UserDetailFragmentArgs by navArgs() private val userDetailViewModel: UserDetailViewModel by viewModel { parame
class UserDetailFragment : Fragment() {
private val args: UserDetailFragmentArgs by navArgs()
private val userDetailViewModel: UserDetailViewModel by viewModel { parametersOf(args.user) }
//standard code
//onCreateActivity where I do some basic stuff like switching the fragments
}
class UserAlbumsFragment : Fragment() {
private val userDetailViewModel: UserDetailViewModel by sharedViewModel() //THIS LINE ISN'T WORKING
//standard code again
}
viewmodel在koin中注册,如下所示:
val viewModelModule = module {
/* other viewmodels */
viewModel { (user: UserModel) -> UserDetailViewModel(get(), get(), user) }
}
然后我们有了我试图定义的儿童片段,如下所示:
class UserDetailFragment : Fragment() {
private val args: UserDetailFragmentArgs by navArgs()
private val userDetailViewModel: UserDetailViewModel by viewModel { parametersOf(args.user) }
//standard code
//onCreateActivity where I do some basic stuff like switching the fragments
}
class UserAlbumsFragment : Fragment() {
private val userDetailViewModel: UserDetailViewModel by sharedViewModel() //THIS LINE ISN'T WORKING
//standard code again
}
正如您所看到的,有一行不起作用,我尝试将其写成:
private val userDetailViewModel: UserDetailViewModel
by sharedViewModel(from = { parentFragment as ViewModelStoreOwner })
但我一直在犯这样的错误:
Caused by: org.koin.core.error.NoParameterFoundException: Can't get parameter value #0 from org.koin.core.parameter.DefinitionParameters@426de94
at org.koin.core.parameter.DefinitionParameters.elementAt(DefinitionParameters.kt:31)
at org.koin.core.parameter.DefinitionParameters.component1(DefinitionParameters.kt:33)
at com.kvw.technicaltestmediamonks.di.KoinModules$viewModelModule$1$5.invoke(Unknown Source:11)
at com.kvw.technicaltestmediamonks.di.KoinModules$viewModelModule$1$5.invoke(KoinModules.kt:37)
at org.koin.core.instance.DefinitionInstance.create(DefinitionInstance.kt:54)
如何在不重新定义userModel的情况下获取此viewmodel?我遇到了同样的问题,在koin中注册模块时,我通过将viewmodel更改为single来处理此问题。在您的情况下,请尝试使用此代码进行修改
val viewModelModule = module {
/* other viewmodels */
single { (user: UserModel) -> UserDetailViewModel(get(), get(), user) }
}
如果使用viewModel而不是single,则Koin将在调用sharedViewModel()时创建新对象。因此,需要用户参数来重新创建视图模型
希望这能解决您的问题。如果您有一个带有容器和底部导航的片段,您可以尝试以下技巧: 在父片段中绑定ViewModel:
private val viewModel: UserDetailViewModel by viewModel()
在包含在父片段容器中的子片段中之后:
private val viewModel by lazy { requireParentFragment().getViewModel<UserDetailViewModel>() }
惰性{requireParentFragment().getViewModel()}
此ViewModel将使用父片段的viewModelStore,因此所有子片段的状态都是相同的ViewModel
Koin版本2.1.0是否可以将父活动和子活动作为片段?@James121在本例中使用标准API