Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 匕首2-改装未注入ApiHelperImpl中_Android_Kotlin_Dagger 2_Dagger - Fatal编程技术网

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