简体   繁体   English

创建自定义参数android viewmodel类

[英]Create custom params android viewmodel class

This will create MyViewModel object with default or zero parameters. 这将使用默认或零参数创建MyViewModel对象。

MyActivity MyActivity

ViewModelProviders.of(this)
                .get(MyViewModel::class.java)

How can i create if MyViewModel class have custom parameters constructors ? 如果MyViewModel类具有自定义参数构造函数,如何创建?

MyViewModel MyViewModel

class MyViewModel(context: Application,
                        private val repository: MistakesRepository) : AndroidViewModel(context) {


    val showLoading = ObservableBoolean(false)
    val liveItems = MutableLiveData<List<Mistake>>()

    fun loadAllMistakes(forceLoad: Boolean) {

    }

}

After searching for few blog posts, it could be done by having custom factory object. 在搜索了几篇博客文章之后,可以通过具有自定义工厂对象来完成。 But why there is no documentation about this developer page ? 但是,为什么没有有关此开发人员页面的文档? Or I miss out something here ? 还是我错过了这里的东西?

ViewModelProviders.of(this, object : ViewModelProvider.Factory {
            override fun <T : ViewModel?> create(modelClass: Class<T>): T {
                @Suppress("UNCHECKED_CAST")
                return MyViewModel(applicationContext, mistakesRepository) as T
            }
        })[MyViewModel::class.java]

I can help you in JAVA. 我可以在JAVA中为您提供帮助。 Hopefully you can convert to kotlin better than I can. 希望你能比我更好地转换为kotlin。

class MyViewModelFactory implements ViewModelProvider.Factory {

    private final Context context;
    private final MistakesRepository repository;

    @Inject
    public MyViewModelFactory(Context context, MistakesRepository repository) {
       this.context = context;
       this.repository = repository;
    }

    @Override
    public MyViewModel create(Class modelClass) {
        return new MyViewModel(context, repository);
    }
}

Then finally, to use: 最后,使用:

@Inject MyViewModelFactory factory;
...
MyViewModel createViewModel() {
    return ViewModelProviders.of(this,factory)
                             .get(MyViewModel.class);
}

An attempt in kotlin 在科特林尝试

class MyViewModelFactory @Inject constructor(val context: Context, val repository: MistakesRepository) : ViewModelProvider.Factory {

        override fun create(modelClass: Class): MyViewModel {
            return MyViewModel(context, repository);
        }
    }

@Inject lateinit var factory : MyViewModelFactory
...
fun createViewModel() : MyViewModel {
    return ViewModelProviders.of(this,factory)
                             .get(MyViewModel::java.class);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM