Dagger 2:范围内提供 object 更新

Dagger 2: Update provided object in scope

示例方案:

它基于Mosby examples。我想在 @PerProject 范围内在 ProjectFragmentProjectHistoryFragment 之间共享 Project object。

项目模块:

@Module
public class ProjectModule {

    private Project project;

    public ProjectModule(Project project) {
        this.project = project;
    }

    @Provides
    @PerProject
    public Project provideProject() {
        return project;
    }

}

ProjectModuleProjectComponent 将由 ProjectFragment 创建并共享给每个 Project-dependent fragment。不错

但是有个问题。如果我需要更新 Project 的标题怎么办?在我的例子中,Project 是一个最终的 object,没有任何 setter。 Project 只能在 ProjectFragment 中修改,因此我可以更新和重置 module's 值以供将来注入。但我认为这是不好的做法。有人可以提供更好的建议吗?

不要更改模块中的值。

一个组件(及其包含的模块)有一组对象,它们会在您需要的地方注入。它们被缓存、重用等等。 切换 对象会使您处于不一致的状态
如果您需要更改一个对象,那么 创建一个带有新模块的新组件。

如果您仍然需要更改项目 object 而无需重新创建所有内容,则不要注入 Project 本身,而是注入一些 ProjectManager,这还可以实现一些 Observable 模式,以便在 Project 发生变化时通知您。这样您就可以修改项目并对更改做出反应。