3

我正在尝试在https://developer.android.com/jetpack/docs/guide上实现示例。这解释了应该如何构建 tan android 应用程序。

当我使用相同的代码时,出现以下错误。

java.lang.Class<com.example.UserProfileViewModel> has no zero argument constructor

我可以弄清楚这个错误与

viewModel = ViewModelProviders.of(this).get(UserProfileViewModel.class);

当我为 ViewModel 编写默认的零输入构造函数时,出现以下错误。

Attempt to invoke virtual method 'void android.arch.lifecycle.LiveData.observe(android.arch.lifecycle.LifecycleOwner, android.arch.lifecycle.Observer)' on a null object reference

我无法弄清楚这个错误的原因以及如何解决它。

4

2 回答 2

1

如果您想在片段中提供带有构造函数的视图模型作为依赖项,则有一种不同的方法,

假设您有一个如下视图模型类,

class SampleViewmModel(dataManager:DataManager):ViewModel(){
  //some logic
}

然后你需要创建一个工厂类来支持上面的视图模型,如下所示,

class SampleFactory @Inject constructor(var dataManager:DataManager): ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
    if (modelClass.isAssignableFrom(SampleViewModel::class.java)) {
        return SampleViewModel(dataManager) as T
    }
    throw IllegalStateException()
}

}

现在在您的模块类中,您可以注入以下类,(Note-Datamanager 类是可注入的)

//Provide Factory
@Provides
fun provideFactory(dataManager:DataManager): SampleFactory {
    return SampleFactory(dataManager)
}

//Provide actual viewmodel
@Provides
fun provideViewModel(sampleFactory: SampleFactory): SampleViewModel {
    return ViewModelProviders.of(fragment, sampleFactory)[SampleViewModel::class]
}

没有在你的片段中,你可以像任何其他依赖项一样注入你的视图模型,

@Injetct
lateinit viewModel:SampleViewModel
于 2018-12-28T10:25:29.180 回答
0

您可以使用Koin作为 Dagger 的替代品。Koin 完全支持 Android Architecture ViewModel。它非常易于使用。我更喜欢它用于中小型项目。

// declared ViewModel using the viewModel keyword
val myModule : Module = module {
    viewModel { MyViewModel(get()) } 
    ...
}

// Just get it
class MyActivity() : AppCompatActivity() {

    // lazy inject MyViewModel
    val myViewModel : MyViewModel by viewModel()
}

插入-koin.io

于 2019-04-29T11:28:35.410 回答