@Provides方法只能在@Module或@ProducerModule内错误求助
错误排查:@Provides methods can only be present within a @Module or @ProducerModule
error: @Provides methods can only be present within a @Module or @ProducerModule
public static final com.technoface.iga.api.BoardingPassService postBoardingPassesRead(@org.jetbrains.annotations.NotNull()
在项目中编写NetworkModule模块时触发上述错误,已尝试更新/更换Gradle版本、清理重建项目、清除缓存、关闭杀毒软件等方案,问题仍未解决。
相关代码
NetworkModule.kt
@Module @InstallIn(SingletonComponent::class) object NetworkModule { @Singleton @Provides fun provideBaseUrl() = BuildConfig.BASE_URL @Provides @Singleton fun provideLoggingInterceptor(): HttpLoggingInterceptor { return HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY) } @ServiceInterceptorOkHttpClient @Singleton @Provides fun providesServiceInterceptor(clientPreferences: ClientPreferences): ServiceInterceptor = ServiceInterceptor(clientPreferences) @Provides @Singleton fun provideOkHttpClient( logging: HttpLoggingInterceptor, @ServiceInterceptorOkHttpClient serviceInterceptor: ServiceInterceptor ): OkHttpClient { return OkHttpClient.Builder() .readTimeout(60, TimeUnit.SECONDS) .connectTimeout(60, TimeUnit.SECONDS) .addInterceptor(logging) .addInterceptor(serviceInterceptor) .build() } @Provides @Singleton fun provideNetworkResultCallAdapterFactory(): CallAdapter.Factory { return NetworkResultCallAdapterFactory.create() } @Provides @Singleton fun provideRetrofit(client: OkHttpClient, callAdapterFactory: CallAdapter.Factory): Retrofit { return Retrofit.Builder() .baseUrl(BuildConfig.BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(callAdapterFactory) .client(client) .build() } @Provides @Singleton fun postBoardingPassesRead(serviceBuilder: ServiceBuilder): BoardingPassService = serviceBuilder.buildService(BoardingPassService::class.java) @Qualifier @Retention(AnnotationRetention.BINARY) annotation class BaseUrl @Qualifier @Retention(AnnotationRetention.BINARY) annotation class ServiceInterceptorOkHttpClient }
BoardingPassServiceRepo.kt
class BoardingPassServiceRepo @Inject constructor( private val boardingPassService: BoardingPassService ) { suspend fun postBoardingPassesRead(boardingPassInfoRequest: BoardingPassInfoRequest) = boardingPassService.postBoardingPassesRead( encryptData(boardingPassInfoRequest) ) }
AppModule.kt
@Module @InstallIn(SingletonComponent::class) object AppModule { @Singleton @Provides fun provideClientPreferences( @ApplicationContext context: Context ) = ClientPreferences(context) } class BoardingPassServiceRepo @Inject constructor( private val boardingPassService: BoardingPassService ) { suspend fun postBoardingPassesRead(boardingPassInfoRequest: BoardingPassInfoRequest) = boardingPassService.postBoardingPassesRead( encryptData(boardingPassInfoRequest) ) }
已尝试的修复方案
- 更新Gradle版本
- 更换Gradle版本
- 清理、重建项目,清除缓存
- 关闭杀毒软件
问题原因及解决方法
核心原因
- 带有
@Provides注解的postBoardingPassesRead方法未被包含在NetworkModule的object代码块内部(代码中该方法无缩进,处于类的外部作用域),导致Dagger无法识别它属于@Module标注的类,触发错误。 AppModule.kt中重复定义了BoardingPassServiceRepo类,会引发编译冲突。
解决步骤
- 调整方法作用域:将
postBoardingPassesRead方法缩进,放入NetworkModule的大括号内部,确保它属于@Module类:
@Module @InstallIn(SingletonComponent::class) object NetworkModule { // ...其他方法 @Provides @Singleton fun provideRetrofit(client: OkHttpClient, callAdapterFactory: CallAdapter.Factory): Retrofit { return Retrofit.Builder() .baseUrl(BuildConfig.BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(callAdapterFactory) .client(client) .build() } // 缩进后,确保在NetworkModule内部 @Provides @Singleton fun postBoardingPassesRead(serviceBuilder: ServiceBuilder): BoardingPassService = serviceBuilder.buildService(BoardingPassService::class.java) // ...内部的Qualifier注解 }
移除重复类定义:删除
AppModule.kt末尾重复的BoardingPassServiceRepo类,仅保留BoardingPassServiceRepo.kt中的定义。检查依赖完整性:确认
ServiceBuilder已被Dagger正确提供,若未提供,需在对应Module中添加@Provides方法。
完成以上步骤后,重新编译项目即可解决该错误。
内容的提问来源于stack exchange,提问作者Ahmet Yılmaz
相关产品推荐
相关产品推荐

