gpt4 book ai didi

android - Dagger 2、库模块和@Singleton

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:25:15 25 4
gpt4 key购买 nike

我正在尝试在具有多个 Android 库模块 的 Android 项目中使用 Dagger 2,并且我希望能够提供类的单例范围实例来自这些模块。

目前,我能够在库模块中定义组件,并在主应用程序模块中注入(inject)实例。

我无法做的是提供一个实例作为单例。

项目结构如下:

Project
├── app
├── library1
·
·
·
└── libraryN

在库中,我以这种方式定义组件:

@Component
public interface LibraryComponent {

// Provide instances of MyManager to MainComponent:
MyManager getMyManager();
}

MyManager 看起来像这样:

public class MyManager {

private static final String TAG = "MyManager";

@Inject
public MyManager() {
Log.d(TAG, "Creating MyManager");
}
}

在主应用程序中,我以这种方式定义我的组件:

@ApplicationScope
@Component(dependencies = {LibraryComponent.class, Library2Component.class})
public interface MainComponent {

void inject(MainActivity target);
}

这是应用程序类:

public class App extends Application {
private MainComponent component;

@Override
public void onCreate() {
super.onCreate();

component = DaggerMainComponent.builder()
.libraryComponent(DaggerLibraryComponent.create())
.library2Component(DaggerLibrary2Component.create())
.build();
}

public MainComponent getComponent() {
return component;
}
}

如果我只将一个范围添加到一个库组件,那么我可以将管理器作为单例提供。但是,如果我尝试对另一个库执行相同的操作,则会出现错误:

@com.codeblast.dagger2lib.ApplicationScope com.codeblast.dagger2lib.MainComponent depends on more than one scoped component:
@Component(dependencies = {LibraryComponent.class, Library2Component.class})
^
@com.codeblast.library.LibraryScope com.codeblast.library.LibraryComponent
@com.codeblast.library2.Library2Scope com.codeblast.library2.Library2Component

同样,我想要实现的只是在我的主应用程序项目中注入(inject)图书馆项目提供的一些管理器的单例范围实例

最佳答案

根据@EpicPandaForce 的建议,使用 Dagger 模块而不是组件解决了我的问题

接下来是我必须进行的必要更改。

第一个是删除库组件并创建库模块:

@Module
public class LibraryModule {

@Singleton
@Provides
MyManager provideMyManager(MyUtility myUtility) {
return new MyManager(myUtility);
}
}

不仅仅是在 App 组件中指定这些模块,以代替组件的依赖项:

@Singleton
@Component(modules = {LibraryModule.class, Library2Module.class})
public interface MainComponent {

void inject(MainActivity target);
}

就是这样,在这段代码中,使用@Singleton 范围注释的管理器类仅正确实例化一次。

关于android - Dagger 2、库模块和@Singleton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40490275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com