标签: kodein

Koin vs Kodein - 依赖注射你喜欢什么?科特林

您更喜欢使用Kotlin安装Android的依赖注入事项?我已经开始使用Kodein,但我不想浪费我的时间,如果Koin更好.

我已经阅读了Makery Kotlin Development的演示文稿https://www.kotlindevelopment.com/koin-vs-kodein/,这真的很棒.

从该演示文稿中可以看出这些差异:

Kodein

  • 强大的
  • 吨的特色
  • 很棒的文档
  • 更复杂的API

孝允

  • 较小
  • 功能较少
  • 自然API

Github明星 Kodein 1164 vs 1350 Koin


谢谢 !!

android dependency-injection kotlin kodein koin

16
推荐指数
1
解决办法
4304
查看次数

为什么Android中需要viewmodel工厂?

我们一直在讨论这个问题,但是我们不知道创建视图模型工厂来创建视图模型而不是直接实例化视图模型的原因。创建仅创建视图模型的工厂有什么好处?

我只是举了一个简单的示例,说明我没有工厂如何做到这一点

这是kodein模块:

val heroesRepositoryModel = Kodein {
    bind<HeroesRepository>() with singleton {
        HeroesRepository()
    }

    bind<ApiDataSource>() with singleton {
        DataModule.create()
    }

    bind<MainViewModel>() with provider {
        MainViewModel()
    }
}
Run Code Online (Sandbox Code Playgroud)

我不使用工厂实例化viewmodel的Activity部分

class MainActivity : AppCompatActivity() {
    private lateinit var heroesAdapter: HeroAdapter
    private lateinit var viewModel: MainViewModel
    private val heroesList = mutableListOf<Heroes.MapHero>()
    private var page = 0
    private var progressBarUpdated = false

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        viewModel = ViewModelProviders.of(this)
                .get(MainViewModel::class.java)
        initAdapter()
        initObserver()
        findHeroes()
    }
Run Code Online (Sandbox Code Playgroud)

我直接实例化用例的ViewModel,而无需在构造函数中使用它

class MainViewModel : ViewModel(), CoroutineScope { …
Run Code Online (Sandbox Code Playgroud)

android mvvm viewmodel kotlin kodein

14
推荐指数
4
解决办法
4107
查看次数

后端内部错误:psi2ir 期间出现异常

我一直在尝试在我的 android studio 中使用 kodein,但遇到了这个问题

根本原因 org.jetbrains.kotlin.psi2ir.generators.ErrorExpressionException 被抛出于: org.jetbrains.kotlin.psi2ir.generators.ErrorExpressionGenerator.generateErrorCall(ErrorExpressionGenerator.kt:99) null: KtCallExpression: kodein() at org.jetbrains。 kotlin.backend.common.CodegenUtil.reportBackendException(CodegenUtil.kt:239)

这是我在活动中的调用方式

通过 kodein() 覆盖 val kodein

我尝试更新所有依赖项,但仍然没有结果,

任何帮助,将不胜感激。

android jvm kotlin android-studio kodein

6
推荐指数
1
解决办法
2689
查看次数

使用Kodein依赖注入,我不想在任何地方传递kodein实例

使用Kodein,我发现我必须传递kodein实例或将它们注入模块和类中.但有时候我的课程如此断开,我希望他们能够发现"一个真正的Kodein".由于这是一个服务器端应用程序,而且我只有一个Kodein范围,因此应该很容易.我可以创建一个全局对象,例如:

val kodeinGlobal: Kodein = Kodein { ... }
Run Code Online (Sandbox Code Playgroud)

但是,当某些模块在不同项目中重复使用时,这不起作用,我们无法轻松共享这一个实例.也许一个单独的模块只是为了保持全局可以工作,但它需要是一个var,我宁愿它不可更改.

Kodein可以自己找到一个主要的,顶级的或全球性的范围吗?

注意: 这个问题是由作者故意编写和回答的(自我回答的问题),因此对于常见的Kotlin/Kodein主题的惯用答案存在于SO中.

dependency-injection kotlin kodein

3
推荐指数
1
解决办法
1982
查看次数

如何使用 Kodein 进行注射?

我刚刚学习了kodein lib用于依赖注入。我如何获取变量的依赖值?下面是我的应用程序类,我将上下文与 kodein 绑定:

class BaseApp : Application(), KodeinAware {
    override val kodein by Kodein.lazy {
        import(contextModule)
    }

    private val contextModule = Kodein.Module(CONTEXT_MODULE_TAG){
        bind<Context>(CONTEXT_TAG) with provider { this@BaseApp }
    }

    companion object{
        private const val CONTEXT_MODULE_TAG = "context_module"
        const val CONTEXT_TAG = "context_tag"
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的存储库类中,我尝试获取上下文,但没有成功。

class BatteryRepository : KodeinAware {
    override val kodein by kodein()
    private val context by instance<Context>(BaseApp.CONTEXT_TAG)
...
Run Code Online (Sandbox Code Playgroud)

其中kodein()方法调用错误:

表达式“kodein”不能作为函数调用。找不到函数“invoke()”

我如何获取上下文?像这样转移上下文是个好主意吗?

android kotlin kodein

3
推荐指数
1
解决办法
4074
查看次数

如何将测试替代注入默认依赖关系图中?

我想使用Kodein将模拟替代插入我的Android工具测试中。我不知道哪种方法最合适。这就是我的想法:

  • 我的应用程序使用KodeinAware应用程序类。托管的Kodein实例包含我的应用程序所需的所有依赖项。
  • 在我的测试中,我想为特定依赖项注入模拟替代,以测试各种情况下应用程序的行为。
  • 每次测试的替代均应不同,并且应在测试运行之前/期间注入。

是配置Kodein扩展在这种情况下明智的,或者是有一个更简单,更适合的方法(如果有的话,它)?

android kotlin kodein

2
推荐指数
2
解决办法
1231
查看次数

Kodein + Ktor = 冻结 kotlin.collections.HashMap 的突变尝试 - 为什么?

最近几天,我一直在为这个例外而苦苦挣扎。

我有一个具有这些依赖项的 kotlin 多平台项目:

  • 科特林 = 1.5.10
  • 编码=7.6.0
  • ktor=1.6.0(内部使用 kotlin 协程 1.5.0-native-mt)

在尝试在本机中使用 httpClient 时,我一直被提到异常:

    at kotlin.Throwable#<init>(/Users/teamcity3/buildAgent/work/290aee0e088a1666/runtime/src/main/kotlin/kotlin/Throwable.kt:23)
    at kotlin.Exception#<init>(/Users/teamcity3/buildAgent/work/290aee0e088a1666/runtime/src/main/kotlin/kotlin/Exceptions.kt:23)
    at kotlin.RuntimeException#<init>(/Users/teamcity3/buildAgent/work/290aee0e088a1666/runtime/src/main/kotlin/kotlin/Exceptions.kt:34)
    at kotlin.native.concurrent.InvalidMutabilityException#<init>(/Users/teamcity3/buildAgent/work/290aee0e088a1666/runtime/src/main/kotlin/kotlin/native/concurrent/Freezing.kt:22)
    at <global>.ThrowInvalidMutabilityException(/Users/teamcity3/buildAgent/work/290aee0e088a1666/runtime/src/main/kotlin/kotlin/native/concurrent/Internal.kt:93)
    at <global>.MutationCheck(Unknown Source)
    at kotlin.collections.HashMap.<set-length>#internal(/Users/teamcity3/buildAgent/work/290aee0e088a1666/runtime/src/main/kotlin/kotlin/collections/HashMap.kt:16)
    at kotlin.collections.HashMap#addKey(/Users/teamcity3/buildAgent/work/290aee0e088a1666/runtime/src/main/kotlin/kotlin/collections/HashMap.kt:292)
    at kotlin.collections.HashMap#put(/Users/teamcity3/buildAgent/work/290aee0e088a1666/runtime/src/main/kotlin/kotlin/collections/HashMap.kt:68)
    at org.kodein.di.internal.DITreeImpl#find(/Users/runner/work/Kodein-DI/Kodein-DI/kodein-di/src/commonMain/kotlin/org/kodein/di/internal/DITreeImpl.kt:132)
    at org.kodein.di.DITree#find$default(/Users/runner/work/Kodein-DI/Kodein-DI/kodein-di/src/commonMain/kotlin/org/kodein/di/DITree.kt:36)
    at org.kodein.di.internal.DIContainerImpl#factory(/Users/runner/work/Kodein-DI/Kodein-DI/kodein-di/src/commonMain/kotlin/org/kodein/di/internal/DIContainerImpl.kt:158)
    at org.kodein.di.DIContainer#factory$default(/Users/runner/work/Kodein-DI/Kodein-DI/kodein-di/src/commonMain/kotlin/org/kodein/di/DIContainer.kt:32)
    at org.kodein.di.DIContainer#provider(/Users/runner/work/Kodein-DI/Kodein-DI/kodein-di/src/commonMain/kotlin/org/kodein/di/DIContainer.kt:76)
    at org.kodein.di.DIContainer#provider$default(/Users/runner/work/Kodein-DI/Kodein-DI/kodein-di/src/commonMain/kotlin/org/kodein/di/DIContainer.kt:75)
    at org.kodein.di.internal.DirectDIBaseImpl#Instance(/Users/runner/work/Kodein-DI/Kodein-DI/kodein-di/src/commonMain/kotlin/org/kodein/di/internal/DirectDIImpl.kt:30)
    at InvalidMutabilitySampleTest.<init>$lambda-6$lambda-5$lambda-4$lambda-3$lambda-2#internal(/Users/r.juszczyk/StudioProjects/lmhu-multiplatform-app/MultiplatformApp/src/iosTest/kotlin/InvalidMutabilitySampleTest.kt:26)
    at InvalidMutabilitySampleTest.$<init>$lambda-6$lambda-5$lambda-4$lambda-3$lambda-2$FUNCTION_REFERENCE$3.invoke#internal(/Users/r.juszczyk/StudioProjects/lmhu-multiplatform-app/MultiplatformApp/src/iosTest/kotlin/InvalidMutabilitySampleTest.kt:25)
    at InvalidMutabilitySampleTest.$<init>$lambda-6$lambda-5$lambda-4$lambda-3$lambda-2$FUNCTION_REFERENCE$3.$<bridge-UNNN>invoke(/Users/r.juszczyk/StudioProjects/lmhu-multiplatform-app/MultiplatformApp/src/iosTest/kotlin/InvalidMutabilitySampleTest.kt:25)
    at io.ktor.client.HttpClientConfig.install$<anonymous>_1#internal(/Users/administrator/Documents/agent/work/8d547b974a7be21f/ktor-client/ktor-client-core/common/src/io/ktor/client/HttpClientConfig.kt:69)
    at io.ktor.client.HttpClientConfig.$install$<anonymous>_1$FUNCTION_REFERENCE$17.invoke#internal(/Users/administrator/Documents/agent/work/8d547b974a7be21f/ktor-client/ktor-client-core/common/src/io/ktor/client/HttpClientConfig.kt:65)
    at io.ktor.client.HttpClientConfig.$install$<anonymous>_1$FUNCTION_REFERENCE$17.$<bridge-UNNN>invoke(/Users/administrator/Documents/agent/work/8d547b974a7be21f/ktor-client/ktor-client-core/common/src/io/ktor/client/HttpClientConfig.kt:65)
    at io.ktor.client.features.json.JsonFeature.Feature#prepare(/Users/administrator/Documents/agent/work/8d547b974a7be21f/ktor-client/ktor-client-features/ktor-client-json/common/src/io/ktor/client/features/json/JsonFeature.kt:129)
    at io.ktor.client.HttpClientConfig.install$<anonymous>_1-2#internal(/Users/administrator/Documents/agent/work/8d547b974a7be21f/ktor-client/ktor-client-core/common/src/io/ktor/client/HttpClientConfig.kt:77)
    at io.ktor.client.HttpClientConfig.$install$<anonymous>_1-2$FUNCTION_REFERENCE$18.invoke#internal(/Users/administrator/Documents/agent/work/8d547b974a7be21f/ktor-client/ktor-client-core/common/src/io/ktor/client/HttpClientConfig.kt:74)
    at io.ktor.client.HttpClientConfig.$install$<anonymous>_1-2$FUNCTION_REFERENCE$18.$<bridge-UNNN>invoke(/Users/administrator/Documents/agent/work/8d547b974a7be21f/ktor-client/ktor-client-core/common/src/io/ktor/client/HttpClientConfig.kt:74)
    at io.ktor.client.HttpClientConfig#install(/Users/administrator/Documents/agent/work/8d547b974a7be21f/ktor-client/ktor-client-core/common/src/io/ktor/client/HttpClientConfig.kt:97)
    at io.ktor.client.HttpClient#<init>(/Users/administrator/Documents/agent/work/8d547b974a7be21f/ktor-client/ktor-client-core/common/src/io/ktor/client/HttpClient.kt:172)
    at io.ktor.client.HttpClient#<init>(/Users/administrator/Documents/agent/work/8d547b974a7be21f/ktor-client/ktor-client-core/common/src/io/ktor/client/HttpClient.kt:81)
    at io.ktor.client#HttpClient(/Users/administrator/Documents/agent/work/8d547b974a7be21f/ktor-client/ktor-client-core/common/src/io/ktor/client/HttpClient.kt:43)
Run Code Online (Sandbox Code Playgroud)

我设法在测试中重现了该崩溃:

class InvalidMutabilitySampleTest { …
Run Code Online (Sandbox Code Playgroud)

kotlin kodein ktor kotlin-native kotlin-multiplatform

1
推荐指数
1
解决办法
479
查看次数