【问题标题】:Koin share dependencies scoped to nested graphKoin 共享依赖关系范围为嵌套图
【发布时间】:2020-12-24 13:38:08
【问题描述】:

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

自从 Google 推荐 single Activity architecture 以来,AndroidX Navigation lib 已成为一个关键库,通过轻松交换 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>

应遵守以下规则:

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

更具体地说:

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

如何在 Koin 中实现这一点?

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

【问题讨论】:

标签: android android-architecture-navigation koin navigation-architecture koin-scope


【解决方案1】:

实际上,我认为您可以在功能模块中使用loadModuleunLoadModule,并使用一些层模块,例如network uiKit 和...控制他们的需求。

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

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

【讨论】:

  • 我已经玩过 load-unloadModule,但无法使其在权限更改/进程死亡的情况下工作。请注意,一旦模块被初始化,就不能使用 loadModule 重新添加它。还可以考虑导航到 FeatureA,然后返回 FeatureB 如果我不能先卸载 FeatureAModule,我将能够注入 FeatureA 依赖项。如果您愿意,请使用提供的示例试一试
  • 你可以试试 fork github.com/timrijckaert/koin/tree/unclear-unload-per-feature/… 看看你的想法是否可行
  • 为什么要在 FeatureA 依赖项不存在时注入它(导航到 FeatureA 然后返回 FeatureB )?我一定会第一时间看看这个项目。
  • 你误解了我的意思。
猜你喜欢
  • 1970-01-01
  • 2016-08-13
  • 1970-01-01
  • 2011-09-28
  • 2011-03-19
  • 2014-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多