You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

@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版本
  • 清理、重建项目,清除缓存
  • 关闭杀毒软件

问题原因及解决方法

核心原因

  1. 带有@Provides注解的postBoardingPassesRead方法未被包含在NetworkModule的object代码块内部(代码中该方法无缩进,处于类的外部作用域),导致Dagger无法识别它属于@Module标注的类,触发错误。
  2. AppModule.kt中重复定义了BoardingPassServiceRepo类,会引发编译冲突。

解决步骤

  1. 调整方法作用域:将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注解
}
  1. 移除重复类定义:删除AppModule.kt末尾重复的BoardingPassServiceRepo类,仅保留BoardingPassServiceRepo.kt中的定义。

  2. 检查依赖完整性:确认ServiceBuilder已被Dagger正确提供,若未提供,需在对应Module中添加@Provides方法。

完成以上步骤后,重新编译项目即可解决该错误。

内容的提问来源于stack exchange,提问作者Ahmet Yılmaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 07:35:36