簡體   English   中英

匕首柄:如果沒有@Provides-annotated 方法,則無法提供

[英]Dagger Hilt: cannot be provided without an @Provides-annotated method

當我在視圖模型中使用如下界面時

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>
}

存儲庫 class 如下所示

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 class 而不是 Interface 時,我的應用程序能夠毫無錯誤地構建。

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

你必須綁定接口

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

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

並以這種方式使用視圖模型注入

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

遲到總比不到好。 此外,您還需要執行接受的答案中提到的事情。如果您使用的是 compose 或最新的 Hilt 版本,請通過以下方式初始化您的 ViewModel: val viewModel: YourViewModel by viewModels()不要使用以下方式: @Inject lateinit var viewModel: YourViewModel

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM