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

Sid*_*mit 11 android dagger-hilt

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

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

我收到如下错误

cannot be provided without an @Provides-annotated method.
  public abstract static class SingletonC implements MainApplication_GeneratedInjector,
Run Code Online (Sandbox Code Playgroud)

我的界面如下

interface TrafficImageRepository {
    suspend fun getTrafficImages() : NetworkResponse<TrafficData, ErrorTrafficImages>
}
Run Code Online (Sandbox Code Playgroud)

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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

class MainViewModel @ViewModelInject constructor(
    private val trafficImagesRepository: DefaultTrafficImagesRepository , <----------------- Working Fine
    @Assisted private val savedStateHandle: SavedStateHandle
) : ViewModel()
Run Code Online (Sandbox Code Playgroud)

Sae*_*tfi 13

必须绑定接口

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

    @Binds
    abstract fun bindRepository(impl: DefaultTrafficImagesRepository): TrafficImageRepository 
}
Run Code Online (Sandbox Code Playgroud)

并以这种方式使用 viewmodel 注入

@HiltViewModel
class MainViewModel @Inject constructor(
    private val trafficImagesRepository: TrafficImageRepository,
    @Assisted private val savedStateHandle: SavedStateHandle
) : ViewModel() 
Run Code Online (Sandbox Code Playgroud)

  • 有效!我从“ActivityComponent”更改为“SingletonComponent”,为什么它不能与“ActivityComponent”一起使用? (2认同)