【问题标题】:Koin error: org.koin.core.error.NoBeanDefFoundException. How to fix the issue?Koin 错误:org.koin.core.error.NoBeanDefFoundException。如何解决问题?
【发布时间】:2021-07-12 07:15:14
【问题描述】:

我刚开始学习 Koin 的依赖注入。这是我的仓库: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 类注入 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 上发现这个错误:

进程:com.anta40.app.diwithkoin,PID:6423 java.lang.RuntimeException:无法启动活动 ComponentInfo{com.anta40.app.diwithkoin/com.anta40.app.diwithkoin.MainActivity}: org.koin.core.error.NoBeanDefFoundException:找不到定义 类:'com.anta40.app.diwithkoin.SessionManager'。检查你的 定义!

我错过了什么?

【问题讨论】:

    标签: android kotlin koin


    【解决方案1】:

    你必须声明如何获取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

    【讨论】:

      猜你喜欢
      • 2023-01-16
      • 1970-01-01
      • 2019-07-16
      • 2021-09-29
      • 2020-08-27
      • 2021-09-23
      • 2019-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多