如何将数据 class 对象从一个模块发送到另一个模块?

How to send a data class object from one module to another module?

我正在使用 Android 导航组件和单个 Activity 架构。我想从模块 A 向模块 B 发送数据 class 对象。

我的 feed 模块在 build.gradle 中导入 store_article模块。

从我的 feed 模块重定向到我的 store_article 模块有效。

我的 feed_nav_graph.xml 看起来像这样:

    <fragment
            android:id="@+id/newsDetailFragment"
            android:name="news.feed.view.ui.NewsDetailFragment"
            tools:layout="@layout/fragment_news_detail">
        <argument
                android:name="article"
                app:argType="feed.model.Article" />
        <action
                android:id="@+id/action_newsDetailFragment_to_storedArticleScreenFragment"
                app:destination="@id/storedArticleScreenFragment" />
    </fragment>

    <fragment
            android:id="@+id/storedArticleScreenFragment"
            android:name="news.stored_article.view.ui.StoredArticleScreenFragment"
            android:label="Stored Articles"
            tools:layout="@layout/fragment_stored_article_screen">
        <argument
                android:name="article"
                app:argType=".core.Article" />
    </fragment>

现在如何从我的 store_article 模块访问数据 class 对象?

我不能这样做 val args: StoredArticleScreenFragmentArgs by navArgs() 因为我必须导入 feed 模块,这会导致循环依赖错误。

class StoredArticleScreenFragment : Fragment() {

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

    }

}

我敢打赌这是因为 Article 模型(app:argType="news.feed.model.Article"StoredArticleScreenFragment 中)。你应该在 store_article-module 中使用一个额外的模型来避免循环依赖。所以 storedArticleScreenFragment 应该有自己的模型来告诉调用者片段需要什么参数。

我发现解决方案是使用与 stored_articles_nav_graph.xml 中的参数完全相同的片段声明来自 stored_article模块。

来自 stored_article 模块的 stored_articles_nav_graph.xml 看起来像这样:

<fragment
            android:id="@+id/storedArticleScreenFragment"
            android:name="stored_article.view.ui.StoredArticleScreenFragment"
            android:label="Stored Articles"
            tools:layout="@layout/fragment_stored_article_screen">
        <argument
                android:name="article"
                app:argType=".core.Article" />
</fragment>

现在,我可以调用 navArgs()feed 模块获取发送文章对象。

class StoredArticleScreenFragment : Fragment() {

    private val args: StoredArticleScreenFragmentArgs by navArgs()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        val article: Article = args.article
    }

}