背景:
我在我的 Android
应用程序中使用 Dagger2
进行依赖项注入(inject),我想将一个对象作为单例注入(inject)到我的 BaseActivity 中,以便在整个应用程序中可用,但Object的值只能在认证过程后设置,其值取决于认证的结果。
构建:
这就是我当前的设置:
public interface Tool {
...
}
public class ToolOne implements Tool {
...
}
public class ToolTwo implements Tool {
...
}
一个通用接口(interface)及其两种不同的实现。
public class ToolConfig {
private Tool currentTool;
public ToolConfig(Tool tool) {
this.currentTool = tool;
}
...
}
充当配置并在整个应用程序中使用的类。
@Provides
@PerApplication
ToolConfig provideToolConfig(Tool tool) {
return new ToolConfig(tool);
}
在我的 Dagger ToolModule 中定义配置的方式。这将被注入(inject)到 BaseActivity 中以供所有类使用。
任务:
如何设置配置的currentTool
值?根据身份验证过程,应将 ToolOne
或 ToolTwo
设置为 currentTool
的值。如果再次进行身份验证过程,应该可以更改它。设置一次后很少会出现这种情况,但它可能会发生,并且我想确保始终使用该对象的相同实例。
有推荐的方法可以让我使用 Dagger2 做到这一点吗?
最佳答案
您可以只定义 @Provides
在它们之间重定向的方法:
@Provides Tool provideTool(
AuthenticationController authController,
Provider<ToolOne> toolOneProvider,
Provider<ToolTwo> toolTwoProvider) {
if (authController.useToolTwo()) {
return toolTwoProvider.get();
}
return toolOneProvider.get();
}
但是,在这种情况下,您需要非常小心,仅注入(inject) Provider<Tool>
(每次调用 get
时都会检查 AuthController )而不是 Tool
(当创建 Tool
注入(inject)类时,它将检查 AuthController 一次,但不会自动更新)。因此,创建一个自定义的单方法 ToolProvider 可能是有意义的,您可以在 @Provides 方法中根据需要注入(inject)三个依赖项,并将当前工具作为 getCurrentTool
返回。调用(等)。
关于android - Dagger2 - 在运行时定义/更新对象的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39921103/