android - Koin错误: org. koin.core.error.NoBeanDefFoundException。如何解决这个问题?

标签 android kotlin koin

我刚刚开始学习 Koin 的依赖注入(inject)。这是我的仓库:https://github.com/anta40/DIWithKoin

这是概述。首先创建一个 SessionManager 类,用于存储和读取字符串值:

import android.content.Context
import android.content.SharedPreferences
import org.koin.android.ext.koin.androidContext
import org.koin.dsl.module

val sessionModule = module {
    single { SessionManager(androidContext()) }
}

class SessionManager (context: Context) {

    private val preferences: SharedPreferences = context.getSharedPreferences("app_pref", Context.MODE_PRIVATE)
    private val MY_CUSTOM_STR = "test"

    init {
        saveStringValue("Hello world 12345")
    }

    private fun saveStringValue(content: String) {
        preferences.edit().putString(MY_CUSTOM_STR, content).apply()
    }

    fun getStringValue(): String? {
        return preferences.getString(MY_CUSTOM_STR, "")
    }
}

然后使用Koin将SessionManager类注入(inject)到MainActivity中:

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.anta40.app.diwithkoin.databinding.ActivityMainBinding
import org.koin.android.ext.android.inject

class MainActivity : AppCompatActivity() {

    private val session: SessionManager by inject()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // Should print "Hello world 12345"
        binding.txtValue.text = session.getStringValue()
    }
}

但是它崩溃了。在logcat上发现这个错误:

Process: com.anta40.app.diwithkoin, PID: 6423 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.anta40.app.diwithkoin/com.anta40.app.diwithkoin.MainActivity}: org.koin.core.error.NoBeanDefFoundException: No definition found for class:'com.anta40.app.diwithkoin.SessionManager'. Check your definitions!

我错过了什么?

最佳答案

您必须声明单例或工厂方法来获取SessionManager

通常,您可以通过 Application 类中的 onCreate 执行此操作:

class YourApp : Application() {


    override fun onCreate() {
       startKoin {
           androidContext(app)
           androidLogger()
           val modules = listOf(
               module { 
                  /*or however you construct it*/
                  factory<SessionManager>{ SessionManager(get()) }
               }
           )
           loadKoinModules(modules)
       }
    }

}

提供的示例使用 koin 2.1.5

关于android - Koin错误: org. koin.core.error.NoBeanDefFoundException。如何解决这个问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68343323/

相关文章:

java - 在 Kotlin 中实例化对象时如何覆盖方法?

java - Kotlin - 是否可以从高阶函数返回变量?

android - 在继承的类中使用 DI (Koin) 时,Jetpack Compose Preview 不起作用

android - 如何防止Android猴子关闭WIFI?

android微调器无法选择项目

android - 我怎样才能让 Picasso 和 OkHttp 一起工作?

android - 使用 LinearSnapHelper 在 recyclerview 中捕捉第一个和最后一个项目的问题

android - Koin 构造函数注入(inject)少量参数 MVVM Android 架构

android - 刀柄 (Android) : cannot find symbol return DaggerApp_HiltComponents_ApplicationC. builder()

android - 带标记的圆圈