Dagger Hilt:如果没有@Provides注释的方法就无法提供

问题描述 投票:0回答:4

当我在视图模型中使用如下界面时

class MainViewModel @ViewModelInject constructor(
    private val trafficImagesRepository: TrafficImageRepository, <----------------- Not working
    @Assisted private val savedStateHandle: SavedStateHandle
) : ViewModel() 

我收到如下错误

cannot be provided without an @Provides-annotated method.
  public abstract static class SingletonC implements MainApplication_GeneratedInjector,

我的界面如下

interface TrafficImageRepository {
    suspend fun getTrafficImages() : NetworkResponse<TrafficData, ErrorTrafficImages>
}

Repository 类如下

class DefaultTrafficImagesRepository @Inject constructor(private val trafficImageService: TrafficImageService) : TrafficImageRepository {

    override suspend fun getTrafficImages(): NetworkResponse<TrafficData, ErrorTrafficImages> {
        lateinit var response: NetworkResponse<TrafficData, ErrorTrafficImages>
        withContext(IO) {
            val currentTimestamp = Constants.getCurrentTime()
            response = trafficImageService.getTrafficImages(currentTimestamp)
        }
        return response
    }
}

但是当我直接使用 DefaultTrafficImagesRepository 类而不是 Interface 时,我的应用程序能够构建而不会出现任何错误。

class MainViewModel @ViewModelInject constructor(
    private val trafficImagesRepository: DefaultTrafficImagesRepository , <----------------- Working Fine
    @Assisted private val savedStateHandle: SavedStateHandle
) : ViewModel()
android dagger-hilt
4个回答
13
投票

必须绑定接口

@Module
@InstallIn(ViewModelComponent::class)
abstract class RepositoryModule {

    @Binds
    abstract fun bindRepository(impl: DefaultTrafficImagesRepository): TrafficImageRepository 
}

并以这种方式使用viewmodel注入

@HiltViewModel
class MainViewModel @Inject constructor(
    private val trafficImagesRepository: TrafficImageRepository,
    @Assisted private val savedStateHandle: SavedStateHandle
) : ViewModel() 

0
投票

迟到总比不到好。 此外,您需要执行已接受的答案中提到的操作。如果您正在使用 compose 或最新的 Hilt 版本,请通过以下方式初始化您的 ViewModel:

val viewModel: YourViewModel by viewModels()
不要使用以下方式:
@Inject lateinit var viewModel: YourViewModel


0
投票

只是为了添加到这篇文章中,以防将来有人需要它,正如Jun Du提到的,将 ViewModel 初始化为

val viewModel: YourViewModel by viewModels()
val viewModel by viewModels<YourViewModel>()
很重要,因为方法 viewModels 在底层创建了您的 viewModel 需要在构造函数中接收注入的依赖项的工厂。为此,您需要 Android KTX 扩展,如本 Android Hilt 文档

中所示

0
投票

我在我的多模块项目中遇到了同样的问题,因为没有添加对带有目标 hilt-module 的 gradle-module 到主应用程序模块(包含每个 hilt-modules)的依赖

© www.soinside.com 2019 - 2024. All rights reserved.