标签: koin-scope

Koin 共享范围为嵌套图的依赖项

我想知道如何使用 Koin 库正确确定依赖范围。

由于 Google 推荐了单一Activity架构,因此AndroidX 导航库已成为通过轻松交换Fragments来促进这一点的关键库。

典型的现代 Android 应用程序在包和/或Gradle模块中具有多个分离的功能。
这些功能模块提供了一个可以在根图中用作嵌套图的图。(见图)

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/root_graph"
    app:startDestination="@id/mainFragment">

    <include app:graph="@navigation/nav_graph_feature_a" />
    <include app:graph="@navigation/nav_graph_feature_b" />

    <fragment
        android:id="@+id/mainFragment"
        android:name="com.example.androidx_navigation.MainFragment"
        android:label="MainFragment"
        tools:layout="@layout/fragment_main">
        <action
            android:id="@+id/action_mainFragment_to_featureAFragment1"
            app:destination="@id/nav_graph_feature_a" />
        <action
            android:id="@+id/action_mainFragment_to_featureBFragment1"
            app:destination="@id/nav_graph_feature_b" />
    </fragment>
</navigation>
Run Code Online (Sandbox Code Playgroud)

功能模块的 Koin 范围

应遵守以下规则:

  • 每层代表一个范围。
  • 内层可以注入外层中定义的任何内容。
  • 没有重叠的层不应该能够注入彼此的依赖关系。
  • 离开一个层应该处理它的依赖项。

更具体地说:

  • FeatureA 可以注入 Activity 和 App 依赖项,但不能注入 FeatureB 依赖项
  • FeatureB 可以注入 Activity 和 App 依赖项,但不能注入 FeatureA 依赖项

如何在 Koin 中实现这一目标?

请注意,共享依赖项不仅限于 ViewModel。
我应该能够在我的范围内共享任何任意类。

android koin android-architecture-navigation navigation-architecture koin-scope

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

Koin 的生命周期范围与活动范围。他们是一样的吗?

我正在从https://github.com/InsertKoinIO/koin/blob/master/koin-projects/docs/reference/koin-android/scope.md学习 Koin 的范围

如果我有一个 Koin 模块如下

val myModule =
    module {
        scope<MyActivity> { scoped { Presenter() } }
    }
Run Code Online (Sandbox Code Playgroud)

在我的活动中,我可以做到这一点

class MyActivity : AppCompatActivity() {

    private val presenter by lazy {
        lifecycleScope.get<Presenter>(Presenter::class.java)
    }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

或者我可以使用this.scopewhere thisis MyActivityobject。

class MyActivity : AppCompatActivity() {

    private val presenter by lazy {
        this.scope.get<Presenter>(Presenter::class.java)
    }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

我测试过它们是一样的。两者是一样的,还是不同的?如果它们不同,它们的区别是什么?

android android-lifecycle kotlin koin koin-scope

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

没有配置 Koin 上下文。请使用 startKoin 或 koinApplication DSL

koin 在我的大多数相同型号的设备上都可以正常工作,但它会导致单个设备崩溃并出现 IllegalStateException,我已将 android 上下文作为 applicationContext 提供,但它仍然会导致崩溃。

在更新到最新版本之前,它抛出“Caused by: java.lang.IllegalStateException: KoinApplication has not been started”,但在更新之后

E/AndroidRuntime: FATAL EXCEPTION: main
Process: #######, PID: 31641
java.lang.RuntimeException: Unable to start activity ComponentInfo{###.activities.SplashScreenActivity}: java.lang.IllegalStateException: No Koin Context configured. Please use startKoin or koinApplication DSL.
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3044)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3122)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1819)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:192)
at android.app.ActivityThread.main(ActivityThread.java:6892)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:556)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:875)
Caused by: java.lang.IllegalStateException: No Koin Context configured. Please use startKoin or koinApplication DSL.
at org.koin.core.context.KoinContextHandler.getContext(KoinContextHandler.kt:29)
at org.koin.core.context.KoinContextHandler.get(KoinContextHandler.kt:35)
at …
Run Code Online (Sandbox Code Playgroud)

mvvm kotlin android-studio koin koin-scope

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