相关疑难解决方法(0)

Dagger 2:将用户输入的参数注入对象

假设我有一个类Util,它接受一个对象 - 类Validator的一个实例.

因为我想避免在Util中实例化Validator类,所以我通过构造函数传递它:

public class Util {

   @Inject
   public Util(Validator validator) {

   }


}
Run Code Online (Sandbox Code Playgroud)

我有一个提供Validator实例的模块:

@Provides
@Singleton
Validator provideValidator() {
    return Validator.getInstance();
}
Run Code Online (Sandbox Code Playgroud)

和Util类的一个实例:

@Provides
Util provideUtil(Validator validator) {
    return new Util(validator);
}
Run Code Online (Sandbox Code Playgroud)

我有一个组件连线,它会给我一个Util的实例:

Util getUtil()
Run Code Online (Sandbox Code Playgroud)

所以在我的活动中,我可以称之为:

Util myUtil = getComponent.getUtil();
Run Code Online (Sandbox Code Playgroud)

所有这些都可以正常工作 - myUtil在实例化时有一个适当的Validator类实例.

现在我想传入一个名为address的String变量(通过UI输入用户).我想更改构造函数,所以我传入Validator的实例和用户输入的String:

@Inject
public Util(Validator validator, String address) {

}
Run Code Online (Sandbox Code Playgroud)

我无法理解如何传递第二个参数.谁能告诉我怎么样?

理想情况下,我想实例化Util,如:

Util myUtil = getComponent.getUtil(txtAddress.getText());
Run Code Online (Sandbox Code Playgroud)

java android dagger-2

46
推荐指数
2
解决办法
2万
查看次数

Android @Singleton上的Dagger 2注释类没有被注入

我目前正在尝试将Dagger 2集成到Android应用程序中.我的项目设置如下:

  • 图书馆
  • 应用程序(取决于库)

在我的库项目中,我定义了一个类,我稍后将其注入到库中的其他需要它的类(活动和常规类)以及应用程序项目中.

@Singleton
public class MyManager{
  @Inject
  public MyManager(){
    //Do some initializing
  }
}
Run Code Online (Sandbox Code Playgroud)

现在 - 例如在我的片段或活动或常规类中,我将按如下方式注入上述Singleton:

public class SomeClass{

  @Inject
  MyManager myManager;
}
Run Code Online (Sandbox Code Playgroud)

或者我想,因为在实践中,myManager总是为空.显然它的构造函数从未被调用过,所以我想我必须错过配置方面的东西?或者我可能误解了文档,但这并不意味着以这种方式工作?MyManager类的目的是成为应用程序范围内可访问的组件累积实体 - 这就是我选择@Singleton的原因.

UPDATE

为了避免混淆:我在评论中提到了我的组件,我认为 - 这是指"基于组件的设计"意义上的组件,与匕首无关.我上面列出了基于匕首的代码 - 我的代码中没有任何与dagger相关的代码.

当我开始添加@Component时,我遇到了一些编译器问题,因为我的dagger2设置不正确 - 请查看这个关于如何正确设置dagger2的真正有用的线程:https://stackoverflow.com/a/29943394/1041533

更新2

这是我更新的代码,基于G. Lombard的建议 - 我更改了代码如下 - 原始的Singleton在库项目中:

@Singleton
public class MyManager{
  @Inject
  public MyManager(){
    //Do some initializing
  }
}
Run Code Online (Sandbox Code Playgroud)

库项目中还有bootstrap类:

@Singleton
@Component
public interface Bootstrap {
    void initialize(Activity activity);
}
Run Code Online (Sandbox Code Playgroud)

然后我在我的活动中使用上面的Bootstrap类(在我的具体应用程序中,而不是在库项目中!但是我在库中也有访问Bootstrap以注入MyManager的类/活动):

public class MyActivity extends Activity{

    @Inject …
Run Code Online (Sandbox Code Playgroud)

java android dagger dagger-2

12
推荐指数
2
解决办法
1万
查看次数

如何在android库项目中使用dagger 2

我有一个核心 Android 库,我在其中定义了接口数量及其默认实现。所有这些都由 CoreComponent 中定义的 CoreModule 公开。

核心模块

@Module
public class CoreModule {

@Provides
public IAuthenticationViewExtension provideToolsViewExtension() {
    return new AuthenticationViewExtension();
}
@Provides
public ISettingsViewExtension provideISettingsViewExtension() {
    return new SettingsViewExtension();
}
}
Run Code Online (Sandbox Code Playgroud)

核心组件

@Component( modules = {CoreModule.class})
public interface CoreComponent {
CoreComponent coreComponent();
void inject(BaseLauncher baseLauncher);
ISettingsViewExtension iSettingsViewExtension();
}
Run Code Online (Sandbox Code Playgroud)

所有的实现都只注入到核心库中。

还有一个依赖于 Core 库的 Ui 库。此外,Ui 库可以为 Core 库中定义的一些接口提供自定义实现。

??? Ui Library
  ??? Core Library
??? Core Library
Run Code Online (Sandbox Code Playgroud)

为了实现目标,我在 Ui 库中创建了自定义 @component 和 @module

@Component(dependencies = {UiComponent.class}, 
modules = {UiModule.class})
public …
Run Code Online (Sandbox Code Playgroud)

java android dagger-2

6
推荐指数
0
解决办法
1183
查看次数

标签 统计

android ×3

dagger-2 ×3

java ×3

dagger ×1