当前位置: 首页 > 面试题库 >

使用不带“ injects”指令的Dagger模块

张建树
2023-03-14
问题内容

我试图使Dagger在@Module批注内没有“ injects”指令的情况下工作。我将测试项目基于Android Simple
Dagger示例

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

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

(编辑):在我的代码中是CTXModules.java

我要删除的部分是“ injects =
HomeActivity.class”。我知道我可以在构造函数中使用@Inject批注标记自己的模块,以在那里删除该部分,但是以某种方式,它不适用于添加到图中的模块。有了那条线,一切都很好。

我之所以需要它,是因为匕首将在基础库项目中实现,而基础库项目将成为某些共享公共代码库的项目的基础,因此,目前或编写这部分代码我都不知道类将注入模块。

我尝试做的事情甚至可能吗?

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

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

(编辑)

我应该提到它。在我的模块中,像在Android
Module类中一样,删除“
injects = HomeActivity.class”并添加“ 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 the 'injects' option in one of your modules.
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2176)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.app.ActivityThread.access$700(ActivityThread.java:135)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.os.Handler.dispatchMessage(Handler.java:102)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.os.Looper.loop(Looper.java:137)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.app.ActivityThread.main(ActivityThread.java:4998)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at java.lang.reflect.Method.invokeNative(Native Method)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at java.lang.reflect.Method.invoke(Method.java:515)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at dalvik.system.NativeStart.main(Native Method)
12-10 09:21:16.807: E/AndroidRuntime(21783): Caused by: java.lang.IllegalArgumentException: No inject registered for members/com.ef.daggertestproject.MainActivity. You must explicitly add it to the 'injects' option in one of your modules.
12-10 09:21:16.807: E/AndroidRuntime(21783):    at dagger.ObjectGraph$DaggerObjectGraph.getInjectableTypeBinding(ObjectGraph.java:281)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at dagger.ObjectGraph$DaggerObjectGraph.inject(ObjectGraph.java:258)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at com.ef.daggertestproject.MyApplication.inject(MyApplication.java:47)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at com.ef.daggertestproject.BaseActivity.onCreate(BaseActivity.java:27)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at com.ef.daggertestproject.MainActivity.onCreate(MainActivity.java:16)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.app.Activity.performCreate(Activity.java:5243)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140)
12-10 09:21:16.807: E/AndroidRuntime(21783):    ... 11 more

另外,我已经将测试项目上传到github

(最终编辑)根据Jake的回答:“将模块声明为库并不能减轻Dagger了解注入点的需求。” 因此,我最初的问题的答案是不可能的。


问题答案:

你要

@Module(library=true)

这是文档所说的library

如果此模块中所有包含的绑定对于满足其所有可注入类型都是必需的,则为False。如果模块不是库模块,则可以进行其他静态检查:工具可以检测是否不需要包含的绑定。
如果您提供此模块图未使用的绑定,则必须声明library = true。

(强调我的)

将模块声明为库并不能减轻Dagger了解注入点的需求。您仍然必须在对象图中使用列出的注入声明一个模块。

您的示例的极端简化版本如下所示:

repo/
 +- library/
 |   +- Foo.java
 |   `- FooModule.java
 |
 `- app/
     +- BarActivity.java
     `- BarModule.java

FooModule.java

@Module(library = true)
public final class FooModule {
  @Provides @Singleton provideFoo() {
    return Foo();
  }
}

BarModule.java

@Module(
  injects = BarActivity.class,
  includes = FooModule.class
)
public final class BarModule {
}

BarActivity.java(或类似)中:

ObjectGraph og = ObjectGraph.create(new BarModule());
og.inject(this);


 类似资料:
  • 问题内容: 确实为此感到挣扎-尝试了我能想到的所有方法。希望有人可以提供帮助。 我有一条指令可以为我创建自定义控件的轮廓。定制控件的中心部分将由另一个动态生成的指令表示,该指令基于外部指令上的作用域变量的值。作用域变量包含内部指令的名称。我这样做是因为我的页面将包含多个动态生成的元素,这些元素均具有相同的布局,但内部内容不同。 即我的外部指令的示例: 设置为另一个指令的名称-在这种情况下。因此,我

  • 问题内容: 我试图在类型文件的输入标签上使用ng-model: 但是选择文件后,在控制器中,$ scope.vm.uploadme仍未定义。 如何在控制器中获取所选文件? 问题答案: 我使用指令创建了一种解决方法: 输入标签变为: 或者,如果仅需要文件定义:

  • 问题内容: (来自/ r / androiddev的x- post ) 我想以说这不是“更好”的帖子作为开头。严格来说,这是一个关于如何使用Dagger构建东西(以及如何在Kodein中构建它以帮助说明问题)的问题。 我已经在多个工作项目中使用Kodein几年了,但是我发现它使用起来非常容易,以至于我再也不会看过Dagger了。我开始了一个新的个人项目,我想再给Dagger做个尝试。 为简单起见,

  • 问题内容: 我很困惑。如果每页只能使用一次,则如何使用位于不同模块,不同.js文件中的指令。看: 因此,我现在如何指向页面上的secondModule,而无需从mainModule.js引用它 问题答案: 有一种解决方案,可以以编程方式在页面上引导几个角度模块(docs)。 您必须从html中删除属性。 定义几个模块: 然后在index.html中执行: 这是使用此解决方案的有效plnkr。

  • 如何使用新的 在使用dagger的旧版本之前,我们可以在构造函数中传递活动,并在提供者方法中返回该活动。但我不知道如何用dagger android做到这一点 我有以下模块。然而,dagger现在不关心。 是由实现的接口。我希望能够将此注入到我的中,即。 在预测活动 我的ActivityBuilder如下: 我的组成部分是: 我的申请是: 因此,问题是当使用dagger-android时,我如何将

  • 问题内容: 我有一个Dockerfile,我正在将其安装在一起以安装Vanilla python环境(稍后将在其中安装应用程序)。 构建运行正常,直到最后一行,我得到以下异常: 如果我进入该目录(只是为了测试是否已完成前面的步骤),我可以看到文件按预期存在: 如果我尝试仅运行命令,则会收到与上述相同的“未找到”错误。但是,如果我运行交互式shell会话,则源代码确实可以工作: 我可以从这里运行脚本