当前位置: 首页 > 知识库问答 >
问题:

如果没有@提供注释的方法,则无法提供匕首刀柄

窦伟
2023-03-14

我是新来的,用匕首。所以,我不能解决这个有什么问题。我只想问在这里解决它。

这是错误:

c:\ Users \ MSI \ Documents \ MyAndroidProjects \ movie projects \ App \ build \ generated \ hilt \ component _ sources \ debug \ com \ example \ movie App \ App _ hilt components . Java:128:错误:[Dagger/missing binding]com . example . movie App . API . movie App service不能在没有@Provides-annotated方法的情况下提供。公共抽象静态类SingletonC实现App_GeneratedInjector,^ com . example . movie app . API . movie app service在com . example . movie app . repository . movie repository(movie app service)com . example . movie app . repository . movie repository在com . example . movie app . viewmodel . mainviewmodel(repository,;com . example . movie app . viewmodel . mainviewmodel在com . example . movie app . viewmodel _ mainviewmodelbinds module . binds(arg 0)@ dagger . hilt . Android . internal . life cycle . hiltviewmodelmap Java . util . map

MainViewModel.kt

@HiltViewModel
class MainViewModel@Inject constructor(
    private val repository: MovieRepository,
    @ApplicationContext private val context: Context
) : ViewModel() {

    val movieList = MutableLiveData<Resource<Movie>>()

    fun getAllMovies(movieName: String) {
        movieList.postValue(Resource.Loading())
        viewModelScope.launch {
            try {
                if (hasInternetConnection(context)) {
                    val response = repository.getMovies(movieName, "ffe9063f")
                    movieList.postValue(Resource.Success(response.body()!!))
                } else
                    movieList.postValue(Resource.Error("Internet yok"))
            } catch (ex: Exception) {
                when (ex) {
                    is IOException -> movieList.postValue(Resource.Error("Network Failure " + ex.localizedMessage))
                    else -> movieList.postValue(Resource.Error("Conversion Error"))
                }
            }
        }
    }
}

电影存储库.kt

@Singleton
class MovieRepository @Inject constructor(private val movieAppService: MovieAppService) {

    suspend fun getMovies(title: String, aKey: String): Response<Movie> = withContext(
        Dispatchers.IO
    ) {
        val movies = movieAppService.getMovies(title = title, aKey = aKey)
        movies
    }
}

ApiModule.kt

class ApiModule {
    @Module
    @InstallIn(SingletonComponent::class)
    object ApiModule {

        @Provides
        @Singleton
        fun provideLoggingInterceptor(): HttpLoggingInterceptor {
            return HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)
        }

        @Provides
        @Singleton
        fun provideOkHttpClient(logging: HttpLoggingInterceptor): OkHttpClient {
            return OkHttpClient.Builder()
                .addInterceptor(logging)
                .connectTimeout(15, TimeUnit.SECONDS) // connect timeout
                .readTimeout(15, TimeUnit.SECONDS)
                .build()
        }

        @Provides
        @Singleton
        fun provideRetrofit(client: OkHttpClient): Retrofit {
            return Retrofit.Builder()
                .baseUrl(ENDPOINT)
                .addConverterFactory(GsonConverterFactory.create())
                .client(client)
                .build()
        }

        @Provides
        @Singleton
        fun provideMovieAppService(retrofit: Retrofit): MovieAppService {
            return retrofit.create(MovieAppService::class.java)
        }
    }
}

MovieAppService.kt

interface MovieAppService {

    companion object {
        const val ENDPOINT = "http://www.omdbapi.com/"
    }

    @GET(".")
    suspend fun getMovies(@Query("t") title: String,@Query("apikey") aKey: String): Response<Movie>
}

共有1个答案

纪佐
2023-03-14

不要用相同的命名类包装您的单个对象模块。像这样更改模块文件或更改类名

@Module
@InstallIn(SingletonComponent::class)
object ApiModule {
    
    @Provides
    @Singleton
    fun provideLoggingInterceptor(): HttpLoggingInterceptor {
        return HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)
    }

    @Provides
    @Singleton
    fun provideOkHttpClient(logging: HttpLoggingInterceptor): OkHttpClient {
        return OkHttpClient.Builder()
            .addInterceptor(logging)
            .connectTimeout(15, TimeUnit.SECONDS) // connect timeout
            .readTimeout(15, TimeUnit.SECONDS)
            .build()
    }

    @Provides
    @Singleton
    fun provideRetrofit(client: OkHttpClient): Retrofit {
        return Retrofit.Builder()
            .baseUrl(ENDPOINT)
            .addConverterFactory(GsonConverterFactory.create())
            .client(client)
            .build()
    }

    @Provides
    @Singleton
    fun provideMovieAppService(retrofit: Retrofit): MovieAppService {
        return retrofit.create(MovieAppService::class.java)
    }
    
}
 类似资料:
  • 承认,匕首是强硬的,我正试图注射改型。我注入了Context和SharedPreferences,它工作得很好,但改型破坏了这一切。它可以识别DaggerRetrofitComponent类,但不能找到DaggerAppComponent。

  • 我想在我的片段(HomeFragment)中注入一个依赖项(HomeViewModel)。 我有一个类(HomeViewModelImpl)实现了该抽象(HomeViewModel),在这个类中,我当然覆盖了父级的方法。 抽象类(HomeViewModel)是从BaseViewModel扩展而来的抽象类。 BaseViewModel是一个普通的开放类,它从Android生命周期组件的ViewMod

  • 所以我正在尝试将我的整个应用程序从匕首迁移到刀柄,显然我无法注入活动和碎片。 我的活动: 我的片段: 我的应用程序类: 像这样注入我的活动: 它抛出了这个错误: 项目级成绩: 应用级 Gradle(所有 3 个模块): 会不会是我的活动和片段扩展了不能用@ AndroidEntryPoint注释的基,因为它们有类型参数??救命啊! 同样在 dagger2 中,我使用了如下接口: 它的工作,但柄据说

  • 我正试图从这篇中级文章中学习Dagger2,并将RequestQueue作为活动级依赖项传递:https://proandroiddev.com/dagger-2-annotations-binds-contributesandroidinjector-a09e6a57758f我可以很好地创建应用程序组件,但我在ContributesAndroidInjector方面遇到了很多麻烦。应用类别: 应

  • 我试图在learn pourposes的种子项目中添加dagger2(我不是专家),但我有同样的问题: E: /Users/foca/projects/personalProjects/bar-droid-application/bar-droid/app/build/tmp/kapt3/stubs/debug/com/bar/bar_droid/di/AppC: 8:错误:[Dagger/Mis

  • 我是新手,我想在我的课上注入上下文和网络(使用改型)。 这是我到目前为止的代码: 这是我的组件: 但是我如何在应用程序类中使用注入器,这是没有意义的