Android 匕首2-改装未注入ApiHelperImpl中
您好,我正在尝试在Android 匕首2-改装未注入ApiHelperImpl中,android,kotlin,dagger-2,dagger,Android,Kotlin,Dagger 2,Dagger,您好,我正在尝试在ApiHelperImpl.kt类中注入改装。我有下面的模块和组件 AppComponent.kt @Component(modules = arrayOf(AndroidInjectionModule::class, AppModule::class, ActivityBuilder::class)) @Singleton interface AppComponent { fun inject(app: PartnerApplication) } AppModule
ApiHelperImpl.kt
类中注入改装
。我有下面的模块和组件
AppComponent.kt
@Component(modules = arrayOf(AndroidInjectionModule::class, AppModule::class, ActivityBuilder::class))
@Singleton
interface AppComponent {
fun inject(app: PartnerApplication)
}
AppModule.kt
@Module
class AppModule {
@Provides
@Singleton
fun providesPartnerApplication(application: Application): Application = application
@Provides
@Singleton
fun providesSharedPreferences(application: Application): SharedPreferences {
return PreferenceManager.getDefaultSharedPreferences(application)
}
@Provides
@Singleton
fun provideOkHttpCache(application: Application): Cache {
val cacheSize = 10 * 1024 * 1024L // 10 MiB
return Cache(application.cacheDir, cacheSize)
}
@Provides
@Singleton
fun provideMoshi(): Moshi = Moshi.Builder().build()
@Provides
@Singleton
fun provideOkHttpClient(cache: Cache): OkHttpClient {
val okHttpClient = OkHttpClient()
okHttpClient.newBuilder()
.cache(cache)
.build()
return okHttpClient
}
@Provides
@Singleton
fun provideRetrofit(moshi: Moshi, okHttpClient: OkHttpClient): Retrofit {
return Retrofit.Builder()
.addConverterFactory(MoshiConverterFactory.create(moshi))
.baseUrl(BuildConfig.BASE_URL)
.client(okHttpClient)
.build()
}
}
PartnerApplication.kt
class PartnerApplication : Application(), AnkoLogger, HasActivityInjector {
@Inject lateinit var activityInjector: DispatchingAndroidInjector<Activity>
override fun activityInjector(): AndroidInjector<Activity> {
return activityInjector
}
override fun onCreate() {
super.onCreate()
DaggerAppComponent.create().inject(this)
}
override protected fun attachBaseContext(base: Context) {
super.attachBaseContext(base)
MultiDex.install(this)
}
}
ActivityBuilder.kt
@Module
abstract class ActivityBuilder {
@ContributesAndroidInjector(modules = arrayOf(LoginActivityModule::class))
abstract fun bindLoginActivity(): LoginActivity
}
我犯了一个错误
Process: com.partner.android, PID: 9697
kotlin.UninitializedPropertyAccessException: lateinit property retrofit has not been initialized
at com.partner.android.data.remote.ApiHelperImpl.doServerLoginApiCall(ApiHelperImpl.kt:32)
at com.partner.android.login.LoginViewModel.login(LoginViewModel.kt:45)
at com.partner.android.databinding.ActivityLoginBinding$OnClickListenerImpl.onClick(ActivityLoginBinding.java:298)
at android.view.View.performClick(View.java:5637)
at android.view.View$PerformClick.run(View.java:22429)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
为什么
改型
没有在ApiHelperImpl类中注入。为了在ApiHelperImpl
中使用@Inject
,您必须将它(在组件上调用Inject
)添加到依赖关系图中。在本例中,我将把它作为依赖项传递给ApiHelperImpl
class ApiHelperImpl @Inject constructor(val retrofit : Retrofit) : ApiHelper {
val mRetrofit = retrofit
应该这样做您可以使用模块实现相同的功能
@Module
class ApiModule {
@Provides
@Singleton
fun apiService(context: Context): WebService {
val mBaseUrl = context.getString(if (BuildConfig.DEBUG) R.string.local_url else R.string.live_url)
val loggingInterceptor = HttpLoggingInterceptor()
loggingInterceptor.level = if (BuildConfig.DEBUG) HttpLoggingInterceptor.Level.BODY else HttpLoggingInterceptor.Level.NONE
val okHttpClient = OkHttpClient.Builder()
.readTimeout(120, TimeUnit.SECONDS)
.writeTimeout(120, TimeUnit.SECONDS)
.connectTimeout(120, TimeUnit.SECONDS)
.addInterceptor(loggingInterceptor)
//.addNetworkInterceptor(networkInterceptor)
.build()
return Retrofit.Builder().baseUrl(mBaseUrl)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build().create(WebService::class.java)
}
}
AppComponent中也有变化
@Singleton
@Component(modules = arrayOf(ApplicationModule::class, ApiModule::class))
interface AppComponent {
...
fun apiService(): WebService
...
}
你的变化
@Component(modules = arrayOf(AndroidInjectionModule::class, AppModule::class, ApiModule ::class))
在相关子模块中添加APIModule
更新
@Component(modules = arrayOf(AndroidInjectionModule::class, AppModule::class, ActivityBuilder::class))
@Singleton
interface AppComponent {
fun inject(app: PartnerApplication)
fun apiService(): ApiHelper
}
然后在你想用的时候注射
@Inject
var webService: WebService? = null
您需要调用组件。在ApiHelperImpl
class@H我应该调用component.inject(this)
@Williams的地方,你能在github上发布一个这样的简单项目吗?@azizbekian我想这就是我的代码中与之相关的所有内容dagger@azizbekian如果您认为有什么东西丢失了,请您提出建议。我在LoginViewModel
中称之为ApiHelperImpl
,在这里传递什么?像ApiHelperImpl().doServerLoginApiCall(电子邮件,密码)
你是说class-LoginViewModel@InjectConstructor(val-Reformation:Reformation):AnkoLogger{
签出谢谢。我收到了这个错误:dagger.internal.codegen.ComponentProcessor无法处理这个接口,因为不是它的所有依赖项都可以解析ViewModelProviders.of(this).get(LoginViewModel::class.java)
应该是ViewModelProviders.of(this,mFactory).get(LoginViewModel::class.java)
到目前为止,我在doServerLoginApiCall
中有两种方法,分别返回Observable
和doServerRegistrationAPCALL
中返回Observable
。我不明白我的代码中需要做哪些更改。你能用几行代码显示一下吗谢谢我更新了我的代码问题,请您再次检查一下什么是WebService
以及如何注入apiService()
WebService是声明GET、POST方法的接口类。使用ApiHelper
而不是WebService。并注入ApiHelper实现。注入ApiHelper?构造函数中的何处?
@Module
class ApiModule {
@Provides
@Singleton
fun apiService(context: Context): WebService {
val mBaseUrl = context.getString(if (BuildConfig.DEBUG) R.string.local_url else R.string.live_url)
val loggingInterceptor = HttpLoggingInterceptor()
loggingInterceptor.level = if (BuildConfig.DEBUG) HttpLoggingInterceptor.Level.BODY else HttpLoggingInterceptor.Level.NONE
val okHttpClient = OkHttpClient.Builder()
.readTimeout(120, TimeUnit.SECONDS)
.writeTimeout(120, TimeUnit.SECONDS)
.connectTimeout(120, TimeUnit.SECONDS)
.addInterceptor(loggingInterceptor)
//.addNetworkInterceptor(networkInterceptor)
.build()
return Retrofit.Builder().baseUrl(mBaseUrl)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build().create(WebService::class.java)
}
}
@Singleton
@Component(modules = arrayOf(ApplicationModule::class, ApiModule::class))
interface AppComponent {
...
fun apiService(): WebService
...
}
@Component(modules = arrayOf(AndroidInjectionModule::class, AppModule::class, ApiModule ::class))
@Component(modules = arrayOf(AndroidInjectionModule::class, AppModule::class, ActivityBuilder::class))
@Singleton
interface AppComponent {
fun inject(app: PartnerApplication)
fun apiService(): ApiHelper
}
@Inject
var webService: WebService? = null