首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >org.kodein.di.Kodein$NotFoundException: bind<LLApi>()与?<LoginFragment>()没有绑定。?{?}

org.kodein.di.Kodein$NotFoundException: bind<LLApi>()与?<LoginFragment>()没有绑定。?{?}
EN

Stack Overflow用户
提问于 2020-10-05 05:22:48
回答 1查看 519关注 0票数 1

我正在用objectbox + retrofit + kodein做一个项目。但我得到了这个错误。

代码语言:javascript
运行
复制
org.kodein.di.Kodein$NotFoundException: No binding found for bind<LLApi>() with ?<LoginFragment>().? { ? }

KodeinApplication.kt

代码语言:javascript
运行
复制
class KodeinApplication : Application(), KodeinAware {
    override val kodein = Kodein.lazy {
        import(androidXModule(this@KodeinApplication))

        bind() from singleton { AppVersion }
        bind() from singleton { NetworkConnectivityInterceptor(instance()) }
        bind() from singleton { LLApi }
        bind() from singleton { LoginRepository(instance(), instance()) }
        bind() from provider { LoginViewModelFactory(instance()) }
    }
}

BaseRepository.kt

代码语言:javascript
运行
复制
abstract class BaseRepository<T>(
    val service: LLApi,
    @PublishedApi internal val boxStore: BoxStore
) {
    abstract fun loadData(): LiveData<T>
    inline fun <reified T : Any> fetchData(crossinline call: (LLApi) -> Deferred<Response<T>>): LiveData<T> {
        val result = MutableLiveData<T>()

        CoroutineScope(Dispatchers.IO).launch {
            val request = call(service)
            withContext(Dispatchers.Main) {
                try {
                    val response = request.await()
                    if (response.isSuccessful) {
                        result.value = response.body()
                    } else {
                        Timber.d("Error occurred with code ${response.code()}")
                    }
                } catch (e: HttpException) {
                    Timber.d("Error: ${e.message()}")
                } catch (e: Throwable) {
                    Timber.d("Error: ${e.message}")
                }
            }
        }
        return result
    }

    inline fun <reified T : Any> saveToDatabase(data: T) {
        CoroutineScope(Dispatchers.IO).launch {
            boxStore.boxFor<T>().removeAll()  // deleting and inserting data to avoid sync issues
            boxStore.boxFor<T>().put(data)
        }

    }
}

LoginRepository.Kt

代码语言:javascript
运行
复制
class LoginRepository(service: LLApi, store: BoxStore) :
    BaseRepository<UserInfo>(service, store) {

    private var loginRequest: LoginRequest? = null
    init {
        this.loginRequest = loginRequest
    }

    override fun loadData(): LiveData<UserInfo> {
        return fetchData { service.userLogin(loginRequest) }
    }

}

LoginViewModelFactory.kt

代码语言:javascript
运行
复制
class LoginViewModelFactory(private val repository: LoginRepository) :
    ViewModelProvider.NewInstanceFactory() {
    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        return LoginViewModel(repository) as T
    }
}

LoginViewModel.kt

代码语言:javascript
运行
复制
class LoginViewModel(val repository: LoginRepository) : BaseViewModel<UserInfo>() {
    private lateinit var user: LiveData<UserInfo>
    override fun getDataFromService(): LiveData<UserInfo> {
        user = repository.loadData()
        return user
    }

    override fun saveTODatabase(data: UserInfo) {
        repository.saveToDatabase(data)
    }
}

LoginRequest.kt

代码语言:javascript
运行
复制
data class LoginRequest(
    @SerializedName("mobile_no") val mobileNumber:String?,
    val password:String?
)

LoginFragment.kt

代码语言:javascript
运行
复制
class LoginFragment() : Fragment(), KodeinAware {
    override val kodein by kodein()
    private  val factory: LoginViewModelFactory by instance()
    private  lateinit var binding: LoginFragmentBinding
    private  lateinit var viewModel: LoginViewModel

    private var emailOrPhone: EditText? = null
    private var password: EditText? = null

    companion object {
        fun newInstance(): LoginFragment {
            return LoginFragment()
        }
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        binding = DataBindingUtil.setContentView(requireActivity(), R.layout.login_fragment)
        viewModel = ViewModelProvider(
            this, factory
            
        ).get(LoginViewModel::class.java)

        val view = inflater.inflate(R.layout.login_fragment, container, false)
        emailOrPhone = view?.findViewById(R.id.edt_number_or_email)
        password = view?.findViewById(R.id.edt_password)
        return view
    }

    fun userLoginService() {
        val email = binding.edtNumberOrEmail.text.toString()
        val password = binding.edtPassword.text.toString()

   
         val liveData = viewModel.getDataFromService()
         liveData.observe(this, Observer {
             if (it != null) {
                 viewModel.saveTODatabase(it)
             }
         })
    }
}

请随时索取所需的任何文件,并请帮助我这个问题。

EN

回答 1

Stack Overflow用户

发布于 2022-04-21 05:22:26

是否将KodeinApplication类添加到manifest.xml文件中,如

代码语言:javascript
运行
复制
<application android:name=".KodeinApplication "----/>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64202853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档