标签: dagger

使用没有"injects"指令的Dagger模块

我试图在没有@Module注释中的"注入"指令的情况下使Dagger工作.我的测试项目基于Android Simple Dagger示例

这是给我带来问题的部分:

@Module(
    injects = HomeActivity.class,
    complete = false
)
public class DemoModule {
  // TODO put your application-specific providers here!
}
Run Code Online (Sandbox Code Playgroud)

(编辑):我的代码中有哪些是CTXModules.java

我想要删除的部分是"injects = HomeActivity.class".我知道我可以在构造函数中用@Inject注释标记我自己的模块以删除那里的那个部分,但不知何故它不能用于添加到图形中的模块.有了那条线,一切都很好.

我需要这个的原因是因为dagger将在一个基础库项目中实现,该项目将成为共享公共代码库的一些项目的基础,因此目前或编写这部分代码我不知道是什么类将注入模块.

我甚至想做什么?

我认为这是可能的,因为Android Module类不使用该指令.

希望它足够清楚.提前致谢!

(编辑)

我应该提到它.在我的模块中,我删除"injects = HomeActivity.class"并在Android模块类中添加"library = true" .然后发生的是我得到这个错误(我的错误,我以前没有添加它):

12-10 09:21:16.807: E/AndroidRuntime(21783): FATAL EXCEPTION: main
12-10 09:21:16.807: E/AndroidRuntime(21783): Process: com.ef.daggertestproject, PID: 21783
12-10 09:21:16.807: E/AndroidRuntime(21783): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ef.daggertestproject/com.ef.daggertestproject.MainActivity}: java.lang.IllegalArgumentException: No inject registered for members/com.ef.daggertestproject.MainActivity. You must explicitly add it to …
Run Code Online (Sandbox Code Playgroud)

java android dagger

17
推荐指数
1
解决办法
8461
查看次数

让Dagger在为Android进行espresso功能测试时注入模拟对象

我最近和Dagger一起吃饱了,因为DI的概念完全合情合理.DI的一个更好的"副产品"(杰克沃顿在他的一个演讲中提出)更易于测试.

所以现在我基本上使用espresso做一些功能测试,我希望能够将虚拟/模拟数据注入应用程序并让活动显示出来.我猜是因为,这是DI的最大优势之一,这应该是一个相对简单的问题.出于某种原因,我似乎无法绕过它.任何帮助将非常感激.这是我到目前为止(我写了一个反映我当前设置的例子):

public class MyActivity
    extends MyBaseActivity {

    @Inject Navigator _navigator;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        MyApplication.get(this).inject(this);

        // ...

        setupViews();
    }

    private void setupViews() {
        myTextView.setText(getMyLabel());
    }

    public String getMyLabel() {
        return _navigator.getSpecialText(); // "Special Text"
    }
}
Run Code Online (Sandbox Code Playgroud)

这些是我的匕首模块:

// Navigation Module

@Module(library = true)
public class NavigationModule {

    private Navigator _nav;

    @Provides
    @Singleton
    Navigator provideANavigator() {
        if (_nav == null) {
            _nav = new Navigator();
        }
        return _nav;
    }
}

// App level module

@Module(
    includes = …
Run Code Online (Sandbox Code Playgroud)

android dependency-injection functional-testing dagger android-espresso

17
推荐指数
2
解决办法
9882
查看次数

了解Android架构组件示例GithubBrowserSample:ViewModelModule,ViewModel参数

涵盖Android架构组件的最新样本之一是Google提供的GithubBrowserSample.我查看了代码并出现了一些问题:

  1. 我注意到ViewModelModule包含在AppModule中.这意味着所有视图模型都被添加到DI图中.为什么以这种方式完成而不是Module为每个只提供ViewModel特定活动/片段所需的活动/片段分开?

  2. 在这个具体的例子中,使用GithubViewModelFactory实例化视图模型有没有办法将参数传递给特定的ViewModel?或者更好的解决方案是创建一个setter ViewModel并通过setter设置所需的param?

android dagger dagger-2 android-viewmodel android-architecture-components

17
推荐指数
1
解决办法
1916
查看次数

Dagger注射器不适用于Kotlin中的"物体"

花了很多时间试图弄清楚为什么我的匕首注射不起作用; 我意识到Kotlin中的"对象"类型是问题所在.

以下不起作用,注入的"属性"为空.

object SomeSingleton {

    @Inject
    lateinit var property: Property

    init {
        DaggerGraphController.inject(this)
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,以下DID工作正常:

class NotSingleton {

    @Inject
    lateinit var property: Property

    init {
        DaggerGraphController.inject(this)
    }
}
Run Code Online (Sandbox Code Playgroud)

我试过谷歌,我尝试了文档,但我无法指出这背后的原因.另请注意,我没有尝试使用JAVA,JAVA并没有内置单例的概念.

为什么会这样?为什么kotlin singleton无法注入成员但是常规非单身人士类可以?

singleton android kotlin dagger

17
推荐指数
3
解决办法
3056
查看次数

私有字段上的Android Dagger依赖注入失败

我是匕首的新手(虽然我有使用Weld从事Java EE WebApps的DI经验).

我要做的是将依赖注入类中.这个领域是私人的.

然后Dagger抛出异常声明它不能注入私人领域.

这是什么原因?

毕竟有可能使用反射写入私有字段,即使在android上也是如此.

如果我将字段的可见性设置为非私有,则注入似乎有效.

android dependency-injection dagger

16
推荐指数
2
解决办法
8967
查看次数

使用覆盖模块扩展ObjectGraph

我现在和Dagger一起玩,显然有些功能对我不起作用.

我实际上试图ObjectGraph.plus()用mock模块扩展我的ObjectGraph(via ),它覆盖了已经创建的图形中的一个真实模块.但显然我的模拟模块被忽略了,因此调用了真正的接口.

但是,如果我尝试在图形创建阶段提供我的模拟模块 - 一切正常..

在我的情况下MockModule1覆盖提供者RealModule1

不起作用:

objectGraph = ObjectGraph.create(new RealModule1(), 
                                 new RealModule2(), 
                                 new RealModule3());

objectGraph = objectGraph.plus(new MockModule1());
Run Code Online (Sandbox Code Playgroud)

工作良好

objectGraph = ObjectGraph.create(new RealModule1(), 
                                 new RealModule2(), 
                                 new RealModule3(),
                                 new MockModule1());
Run Code Online (Sandbox Code Playgroud)

RealModule1.java

@Module(injects = MainActivity.class)
public class RealModule1 {

    @Provides
    ISomething provideSomething() {
        return new Something();
    }
}
Run Code Online (Sandbox Code Playgroud)

MockModule1.java

@Module(overrides=true, injects = MainActivity.class)
public class MockModule1 {

    @Provides
    ISomething provideSomething() {
        return new MockSomething();
    }
}
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

java android dependency-injection dagger

16
推荐指数
1
解决办法
2023
查看次数

如何注入BroadcastReceiver

有人已经不得不使用匕首将已经存在的类(带有一些业务逻辑)注入BroadcastReceiver吗?

我正在使用dagger 1并且已经找到了一个很好的例子(https://github.com/adennie/fb-android-dagger)但是,我找不到如何添加一个已经存在的类,它属于一个不同的模块,进入BroadcastReceiver.

任何帮助或建议将不胜感激.

android dependency-injection broadcastreceiver dagger

16
推荐指数
5
解决办法
1万
查看次数

Dagger 2中"HasFragmentInjector"的实际用法是什么?

我之前已经实现了dagger2 v2.2但是现在他们也添加了dagger.android部分.所以我用它创建示例项目.

我知道有关的旧方法@Provide@Modules@Components等注解但是从匕首2.8+,他们也加入了这个Android的支持库,它有一些新的注射像@ActivityKey,@ContributesAndroidInjector,@ Subcomponent.Builder等.

所以我的问题是它带来了什么好处.

它是否解决了像基类的Inject方法可以适用于所有子类的问题?还是其他任何好处?

第二个问题 - HasFragmentInjector只是像我们以前使用片段管理器一样加载片段内部活动?或者我错过了一些东西?

请不要为所有图书馆用户提供更具信息性的问题,因为图书馆的文档没有提供这样的答案.

android dependency-injection dagger dagger-2

16
推荐指数
2
解决办法
4987
查看次数

使用dagger 2的CustomView依赖注入(在活动范围内)

我的问题与类似.

例如,我有一个LiveData实现:

public class CustomLiveData extends LiveData<SomeEvent> {

    @Inject
    public CustomLiveData(@ActivityContext Context context) {
        //....
    }

}
Run Code Online (Sandbox Code Playgroud)

我想要注入自定义视图:

public class CustomView extends View {
   @Inject
   SomeApplicationProvider anyProvider;

   @Inject
   CustomLiveData dataProvider; 
   // Getting @com.di.qualifiers.ActivityContext  android.content.Context cannot be provided without an @Provides-annotated method. 
   // @com.di.qualifiers.ActivityContext android.content.Context is injected at com.repositories.CustomLiveData.<init>(context)
   // com.repositories.CustomLiveData is injected at com.ui.CustomView.dataProvider com.ui.CustomView is injected at 
   // com.di.ApplicationComponent.inject(view)

   public CustomView(Context context) { this(context, null); }
   public CustomView(Context AttributeSet attrs) { 
      super(context, attrs);

      // Works …
Run Code Online (Sandbox Code Playgroud)

android dependency-injection dagger dagger-2

16
推荐指数
1
解决办法
6088
查看次数

如何在不强制消费应用程序使用Dagger的情况下构建基于Dagger的Android库?

我正在开发一个Android库,它基本上是我编写的一些REST服务的客户端.我有几个存储类,网络队列,解析器等,并且像许多这样的类一样,它们依赖于Context或者SharedPreferences构建自的东西Context.这些对象都隐藏在facade类后面,因此我的库的使用者看不到它们或直接与它们交互.

为了我自己的理智,我想使用Dagger 2进行依赖注入,以便在我的库中管理这些类的实例.但是,我不想强​​迫使用我的库的应用程序自己使用Dagger; 仅仅因为我选择使用Dagger并不意味着我的用户应该这样做.

我见过的所有教程似乎都期望我正在构建一个应用程序,而不仅仅是一个库.这些教程中的许多都告诉我应该让我的Application类继承自己DaggerApplication.但就我而言,我的库中根本没有Application(或任何Activity或Service`类),我不希望我的用户必须使用Dagger的基类.

那么我如何才能使用Dagger而不将其"泄漏"出我的库?我在这里找到了部分答案,但我不确定如何调整作者的"包装"模式来处理我对它的依赖Service.我可以将上下文传递给包装器的Context方法,还是Dagger能够以其他方式获取Context引用?

java android dagger dagger-2

15
推荐指数
1
解决办法
960
查看次数