android / architecture-samples

A collection of samples to discuss and showcase different architectural tools and patterns for Android apps.
Apache License 2.0
44.16k stars 11.6k forks source link

Using Hilt2.48.1 version, it is not compatible with BaseViewModel #983

Open cl-6666 opened 8 months ago

cl-6666 commented 8 months ago

The BaseActivity I use encapsulates BaseViewModel, and an error is reported during compilation. The code and error message are as follows error message: public abstract static class SingletonC implements AppApplication_GeneratedInjector, ^ Injection of an @HiltViewModel class is prohibited since it does not create a ViewModel instance correctly. Access the ViewModel via the Android APIs (e.g. ViewModelProvider) instead. Injected ViewModel: com.maxvision.myapplication.YourViewModel

  com.maxvision.myapplication.YourViewModel is injected at
      com.maxvision.myapplication.base.BaseActivity.viewModel
  com.maxvision.myapplication.MainActivity is injected at
      com.maxvision.myapplication.MainActivity_GeneratedInjector.injectMainActivity(com.maxvision.myapplication.MainActivity) [com.maxvision.myapplication.AppApplication_HiltComponents.SingletonC → com.maxvision.myapplication.AppApplication_HiltComponents.ActivityRetainedC → com.maxvision.myapplication.AppApplication_HiltComponents.ActivityC]

code show as below: `abstract class BaseActivity <VM : BaseViewModel, DB : ViewDataBinding> : AppCompatActivity() {

@Inject
lateinit var viewModel: VM
lateinit var binding: DB

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = DataBindingUtil.setContentView(this, getLayoutResId())
    binding.lifecycleOwner = this
}

//获取布局资源id
abstract fun getLayoutResId(): Int

}`

` @HiltViewModel class YourViewModel @Inject constructor( private val apiService: ApiService ) : BaseViewModel() {

}

`

` @AndroidEntryPoint class MainActivity : BaseActivity<YourViewModel, ActivityMainBinding>(){

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
}

override fun getLayoutResId(): Int = R.layout.activity_main

} @HiltAndroidApp class AppApplication : Application() {

override fun onCreate() {
    super.onCreate()

}

companion object {
    private val sInstance: Application? = null
}

} `