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

tim*_*tim 7 android koin android-architecture-navigation navigation-architecture koin-scope

我想知道如何使用 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。
我应该能够在我的范围内共享任何任意类。

ham*_*mid 4

实际上,我认为您可以在功能模块中使用loadModuleand以及一些层模块,例如and ... 控制它们的需求。unLoadModulenetwork uiKit

FeatureA can inject Activity and App dependencies, but not FeatureB dependencies

我认为在FeatureA中注入你的appModule是不合理的,你可以有一个coreModule并将其添加到你需要的所有模块中,你也可以在requireActivity()你的fragmnet中找到你的活动,例如:D,所以FeatureA永远不能注入FeatureB依赖关系,因为它们无法相互访问。

  • 我已经玩过 load-unloadModule,但无法使其与权限更改/进程死亡一起工作。请注意,一旦模块初始化,就无法使用 loadModule 重新添加它。还可以考虑导航到FeatureA,然后返回FeatureB,如果我无法先卸载FeatureAModule,我将能够注入FeatureA依赖项。如果您愿意,请尝试使用提供的示例 (2认同)