首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Koin错误: org.koin.core.error.NoBeanDefFoundException.如何解决这个问题?

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

Stack Overflow用户
提问于 2021-07-12 07:15:14
回答 1查看 1.9K关注 0票数 2

我刚开始学习柯因的依赖注射。这是我的回购:https://github.com/anta40/DIWithKoin

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

代码语言:javascript
复制
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类注入MainActivity:

代码语言:javascript
复制
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上找到此错误:

ComponentInfo{com.anta40.app.diwithkoin/com.anta40.app.diwithkoin.MainActivity}:进程: com.anta40.app.diwithkoin,PID: 6423 java.lang.RuntimeException:无法启动活动

org.koin.core.error.NoBeanDefFoundException:未找到class:'com.anta40.app.diwithkoin.SessionManager'.的定义检查你的定义!

我遗漏了什么?

EN

回答 1

Stack Overflow用户

发布于 2021-07-12 07:22:14

您必须就如何获得SessionManager声明单例或工厂方法

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

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68343323

复制
相关文章

相似问题

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