Kotlin Kodein NotFoundException: Привязка не найдена для bind <String>() с? <Fragment>() - PullRequest
0 голосов
/ 20 сентября 2019

У меня очень простая настройка.Но я не могу выполнить какую-либо сеть внутри моего фрагмента, который я использую Kodein in.

Фрагмент раздувает и обрабатывает все взаимодействия, но зависимость сетевого уровня почему-то отсутствует, потому что я получаю: NotFoundException: No binding found for bind<String>() with ?<Fragment>() каждыеКогда я нажимаю кнопку, которая проверяет имя пользователя / пароль в этом LoginFragmnet.

Я не понимаю эту ошибку, потому что мой класс Fragment не имеет String в своем аргументе / конструкторе?Или даже зависит от String.

Мой класс приложения:

...
override val kodein = Kodein.lazy {
    import(androidXModule(this@MyApplication))
    bind() from singleton { MyLoginApi(instance(), instance()) }
    bind<LoginDataSource>() with singleton { LoginService(instance()) }
    bind<LoginRepository>() with singleton { LoginRepositoryImpl(instance()) }
}
...

Мой API

interface MyLoginApi {

    @POST("Account/Login")
    @FormUrlEncoded
    fun login(
        @Field("username") username: String,
        @Field("password") password: String,
        @Field("sessionType") sessionType: String
    ): Call<BaseApiResponse<Login>>

    @GET("Account/Logout")
    fun logout(
        @Query("token") token: String
    ): Call<BaseApiResponse<Any>>

    companion object {
        operator fun invoke(
            baseUrl: String,
            cache: Cache
        ): MyLoginApi {

            val okHttpClient = OkHttpClient.Builder()
                .cache(cache)
                .readTimeout(60, TimeUnit.SECONDS)
                .connectTimeout(60, TimeUnit.SECONDS)
                .build()

            return Retrofit.Builder()
                .client(okHttpClient)
                .baseUrl(baseUrl)
                .addConverterFactory(JacksonConverterFactory.create())
                .build()
                .create(MyLoginApi::class.java)
        }
    }
}

LoginService (Источник данных)

class LoginService(private val api: MyLoginApi) : LoginDataSource {
    private val bus = EventBus.getDefault()

    init {
        bus.register(this)
    }

    override fun requestLogin(username: String, password: String) {
        val call = api.login(username, password, "mobile")
        call.enqueue { result ->
            when (result) {
                is Result.Success -> {

                    result.response.body()?.let {
                        bus.post(LoginResponse(it, username))
                    } ?: bus.post(LoginResponse(IOException("System Error!")))

                }
                is Result.Failure -> {
                    bus.post(LoginResponse(IOException(result.error)))
                }
            }
        }
}

Класс абстрактного фрагмента:

abstract class InjectionFragment : Fragment(), KodeinAware {

    final override val kodeinContext = kcontext<Fragment>(this)
    final override val kodein: Kodein by kodein()

    final override val kodeinTrigger: KodeinTrigger?
        get() = if (BuildConfig.DEBUG) KodeinTrigger() else super.kodeinTrigger

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        kodeinTrigger?.trigger()
    }
}

Я знаю, что этот сценарий очень тривиален, ноЯ пытаюсь сделать это в качестве теста перед интеграцией в остальную часть проекта.Отображается Fragment, но по какой-то причине, когда я пытаюсь выполнить запрос данных, он вылетает с ошибкой:

org.kodein.di.Kodein$NotFoundException: No binding found for bind<String>() with ?<Fragment>().? { ? }

module ⁣androidModule {
bind<String>(tag = "packageResourcePath") with contexted<Context>().provider { String }
bind<String>(tag = "packageCodePath") with contexted<Context>().provider { String }
bind<String>(tag = "packageName") with contexted<Context>().provider { String }
}

Обновление: При однократном переходе через мой фрагмент этоотладчик говорит, что Repository равно «Ленивое значение еще не инициализировано».

...