我试图使用AndroidViewModel而不是常规的ViewModel,因为AndroidViewModel包含绑定(bind)服务所需的应用程序引用。
我的问题是,如何为我的ViewModelFactory提供应用程序参数?
目前,我正在从ApplicationContext强制转换它,它已经提供ViewModelFactory注入(inject)器实用程序,但是我读到这很危险,因为强制转换了ApplicationContext may not always return the application。
我只是按照Sunflower example学习Android,所以答案可能非常简单。我只是不知道。 。 。然而。 (希望您能提供帮助)。
这是我目前的操作方式,您可能会注意到,它与Google在Sunflower示例中的操作方式密切相关:
使用AndroidViewModel片段
class GalleryFragment : Fragment() {
private lateinit var viewModel: GalleryViewModel
private var memoList: List<Memo> = emptyList()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.gallery_fragment, container, false)
val context = context ?: return view
val factory = InjectorUtils.provideGalleryViewModelFactory(context)
viewModel = ViewModelProviders.of(this, factory).get(GalleryViewModel::class.java)
...
喷射器实用程序
object InjectorUtils {
fun provideMemoViewModelFactory(context: Context, memoId: Long): MemoViewModelFactory {
val application = context.applicationContext as Application //this could be dangerous
val repository = getMemoRepository(context)
return MemoViewModelFactory(application, repository, memoId)
}
}
ViewModelFactory
class MemoViewModelFactory(
private val application: Application,
private val memoRepository: MemoRepository,
private val memoId: Long
) : ViewModelProvider.NewInstanceFactory() {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return MemoViewModel( application, memoRepository, memoId) as T
}
}
ViewModel
class MemoViewModel(
application: Application,
memoRepository: MemoRepository,
private val memoId: Long
) : AndroidViewModel(application) {
...
我关心的是InjectorUtil内部,在这里我通过投射applicationContext获得了对应用程序的引用。如果我沿着那条路走下去,我是否会遇到麻烦?我应该在其他地方添加应用程序引用,在该引用中我可以直接访问它,而无需通过applicationContext的强制转换?
谢谢
约翰
最佳答案
我在这里看到两个解决方案:
Application.get()
。考虑到Application
对象仍然是单例。 关于android - 为AndroidViewModel创建ViewModelFactory的正确方法是什么,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51393867/