标签: dagger

CoroutineDispatcher 注入时 Hilt 构建失败

不确定为什么构建失败。一切似乎都在受控之中

\n
class MapObjectRepositoryIMPL @Inject constructor(\n    @ApplicationContext context : Context,\n    val mapObjectDao: MapObjectDao,\n    val barrechatNetwork: BarreNetwork,\n    @DefaultDispatcher private val defaultScope: CoroutineContext\n) : MapObjectRepository {\n\n
Run Code Online (Sandbox Code Playgroud)\n
@Module\n@InstallIn(ApplicationComponent::class)\nobject DispatcherModule {\n\n    @DefaultDispatcher\n    @Provides\n    fun providesDefaultDispatcher(): CoroutineDispatcher = Dispatchers.Default\n\n    @IoDispatcher\n    @Provides\n    fun providesIoDispatcher(): CoroutineDispatcher = Dispatchers.IO\n\n    @MainDispatcher\n    @Provides\n    fun providesMainDispatcher(): CoroutineDispatcher = Dispatchers.Main\n}\n\n@Qualifier\n@Retention(AnnotationRetention.BINARY)\nannotation class IoDispatcher\n\n@Qualifier\n@Retention(AnnotationRetention.BINARY)\nannotation class MainDispatcher\n\n@Qualifier\n@Retention(AnnotationRetention.BINARY)\nannotation class DefaultDispatcher\n
Run Code Online (Sandbox Code Playgroud)\n

我收到的错误是这样的,但看起来我正确提供了所有内容,限定符和对存储库类的注入,这很奇怪......

\n
ANTLR Tool version 4.5.3 used for code generation does not match the current runtime version 4.7.1ANTLR Runtime version 4.5.3 used for parser …
Run Code Online (Sandbox Code Playgroud)

android dagger kotlin-coroutines dagger-hilt

11
推荐指数
1
解决办法
3528
查看次数

Dagger在模块上找不到注射成员

我在Android项目中使用Dagger进行依赖注入,并且可以编译和构建应用程序.对象图看起来是正确和有效的,但是当我添加dagger-compiler作为依赖以在编译时获取错误时,它会报告一些奇怪的错误:

[ERROR] error: No binding for com.squareup.tape.TaskQueue<com.atami \
    .mgodroid.io.NodeIndexTask> required by com.atami \
    .mgodroid.ui.NodeIndexListFragment for com.atami.mgodroid \
    .modules.OttoModule
[ERROR] error: No binding for com.squareup.tape.TaskQueue<com.atami \
    .mgodroid.io.NodeTask> required by com.atami \
    .mgodroid.ui.NodeFragment for com.atami.mgodroid.modules.OttoModule
[ERROR] error: No injectable members on com.squareup.otto.Bus. Do you want 
     to add an injectable constructor? required by com.atami. \
     mgodroid.io.NodeIndexTaskService for 
     com.atami.mgodroid.modules.TaskQueueModule
Run Code Online (Sandbox Code Playgroud)

Otto错误看起来像Eric Burke在他的Android App Anatomy演示文稿中提到的没有@Provides注释,但正如你在下面我看到的那样.

我的Otto和TaskQueue模块如下:

@Module(
        entryPoints = {
                MGoBlogActivity.class,
                NodeIndexListFragment.class,
                NodeFragment.class,
                NodeActivity.class,
                NodeCommentFragment.class,
                NodeIndexTaskService.class,
                NodeTaskService.class
        }
)
public …
Run Code Online (Sandbox Code Playgroud)

android dependency-injection dagger

10
推荐指数
1
解决办法
8754
查看次数

使用匕首在ContentProvider中注入数据库

我想注入一个单身SqliteOpenHelperContentProvider.但是,似乎ContentProvider在创建Application实例之前构建实例(getApplicationContext()返回null).我什么时候可以注入数据库?我已经尝试过构造函数和onCreate()方法ContentProvider.

android dagger

10
推荐指数
3
解决办法
3349
查看次数

@Module在dagger for android中意味着什么?

我已经阅读了很多博客,但我仍然无法弄清楚@Module匕首中的注释功能. @Inject我得到它在运行时提供依赖注入.但是做了什么呢@Module.因为对象图也是建立在模块上的.

例如,我有这段代码来自https://github.com/AndroidBootstrap/android-bootstrap.

@Module(
    complete = false,

    injects = {
        BootstrapApplication.class,
        BootstrapAuthenticatorActivity.class,
        MainActivity.class,
        BootstrapTimerActivity.class,  
    }
)
public class BootstrapModule {
}
Run Code Online (Sandbox Code Playgroud)

那基本上做了什么呢.因为我也试图使用匕首构建一个应用程序作为android的依赖注入.但是因为我无法@Module清楚地得到概念,所以我只是被卡住了.

任何人都可以帮助我一些基本的例子或概念.我认为这对所有使用匕首的人都有帮助.

android dagger android-bootstrap

10
推荐指数
2
解决办法
3309
查看次数

使用Dagger2时创建测试依赖项

在阅读dagger 2的文档时,我无法找到一种简单的方法来在构建应用程序进行测试时提供依赖关系.我发现的唯一线索是:

Dagger 2不支持覆盖.覆盖简单测试假货的模块可以创建模块的子类来模拟该行为.应该分解使用覆盖并依赖依赖注入的模块,以便将被覆盖的模块表示为两个模块之间的选择.

我不明白我将如何在Android上设置这样的配置,任何人都可以解释一下?

android dagger dagger-2

10
推荐指数
1
解决办法
3334
查看次数

flink - 使用匕首注射 - 不可序列化?

我使用Flink(最新通过git)从kafka流到cassandra.为了简化单元测试我通过Dagger添加依赖注入.

ObjectGraph似乎正在正确设置自己,但是'内部对象'被Flink标记为"不可序列化".如果我直接包含这些对象,它们可以工作 - 那么有什么区别?

有问题的类实现了MapFunction@Inject一个用于cassandra的模块和一个用于读取配置文件的模块.

有没有办法建立这个,所以我可以使用后期绑定或Flink使这不可能?


编辑:

fwiw - 依赖注入(通过匕首)和RichMapFunction不能共存.Dagger不允许您包含任何在其定义中扩展的对象.

进一步:

通过Dagger Lazy <t>实例化的对象也不会序列化.

线程"main"中的异常org.apache.flink.api.common.InvalidProgramException:对象com.someapp.SaveMap@2e029d61不可序列化
...
引起:java.io.NotSerializableException:dagger.internal.LazyBinding $ 1

java serialization dagger apache-flink

10
推荐指数
1
解决办法
5254
查看次数

错误:找不到符号变量DaggerAppComponent

在尝试集成最新的Dagger 2版本时,我遇到了Dagger自动生成的问题.尽管有几个Rebuild和Make Module App进程,但Dagger并没有自动生成DaggerAppComponent.

申请类:

public class BaseApplication extends Application
{
    private AppComponent appComponent;

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

    private void initAppComponent()
    {
        DaggerAppComponent.builder()
                .appModule(new AppModule(this))
                .build();
    }

    public AppComponent getAppComponent()
    {
        return appComponent;
    }
}
Run Code Online (Sandbox Code Playgroud)

AppComponent

@Singleton
@Component(modules = AppModule.class)
public interface AppComponent
{
    void inject(BaseApplication application);
}
Run Code Online (Sandbox Code Playgroud)

的AppModule:

@Module
public class AppModule
{
    private BaseApplication application;

    public AppModule(BaseApplication app)
    {
        application = app;
    }

    @Provides
    @Singleton
    Context provideContext()
    {
        return application;
    }

    @Provides
    Application provideApplication() …
Run Code Online (Sandbox Code Playgroud)

android dependency-injection dagger dagger-2

10
推荐指数
3
解决办法
1万
查看次数

Dagger 2 ContributesAndroidInjector为模块提供活动

我正试图找出一种不那么模板化的方法来实现ActivityModule我在所有应用程序活动中使用的方法.这是我目前的设置:

ActivityModule:

@Module
class ActivityModule(private val activity: Activity) {

    @Provides @ActivityScope
    fun providesActivity(): Activity = activity

    @Provides @ActivityContext @ActivityScope
    fun providesContext(): Context = activity

    @Provides @ActivityContext @ActivityScope
    fun providesLayoutInflater(): LayoutInflater = activity.layoutInflater

    @Provides @ActivityContext @ActivityScope
    fun providesResources(): Resources = activity.resources

}
Run Code Online (Sandbox Code Playgroud)

AppActivityModule(为AndroidInjectionModule提供活动)

@Module(subcomponents = [
        AppActivityModule.WelcomeActivityComponent::class
    ])
    internal abstract class AppActivityModule {

        @Binds 
        @IntoMap 
        @ActivityKey(WelcomeActivity::class)
        abstract fun bindWelcomeActivityInjectorFactory(builder: WelcomeActivityComponent.Builder): AndroidInjector.Factory<out Activity>

        @ActivityScope
        @Subcomponent(modules = [(ActivityModule::class)])
        interface WelcomeActivityComponent : AndroidInjector<WelcomeActivity> {
        @Subcomponent.Builder abstract class Builder : AndroidInjector.Builder<WelcomeActivity>() …
Run Code Online (Sandbox Code Playgroud)

java android kotlin dagger dagger-2

10
推荐指数
1
解决办法
1755
查看次数

匕首自定义范围,如何?

如何使用Dagger创建自定义范围?

有指导方针吗?我没找到他们.

我正在开发一个Vaadin应用程序,需要一个自定义范围.像UiScoped这样的东西.

最好的祝福

java dependency-injection dagger

9
推荐指数
1
解决办法
3874
查看次数

模块取决于Dagger中的另一个模块

我正在尝试使用Dagger对我正在构建的应用程序执行依赖注入,并且当我有一个包的模块时,根据Injector提供的值(可能是由另一个模块提供),在构建正确的DAG时遇到了麻烦.

如果我有一个简单的模块用于一些可配置的变量(例如,我可能想换掉测试环境)

@Module(
    injects = DependentModule.class,
)
public class ConfigModule {

    @Provides @Named("ConfigOption") String provideConfigOption() {
        return "This Module's configurable option!";
    }
}
Run Code Online (Sandbox Code Playgroud)

另一个模块取决于它,例如

@Module(
    injects = {
            TopLevelClass.class
    }
)
public class DependentModule {

    @Inject @Named("ConfigOption") String configOption;

    public DependentModule() {
        ObjectGraph.create(this).inject(this);
        doSomethingWithConfig(configOption);
    }

    @Provides @Singleton UsefulValue provideUsefulValue() {
        // Whatever this module needs to do...
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试在构造函数中引导注入的行失败了,它抱怨我没有injects在适当的模块中指定显式行.

通过反复试验,我看到如果@Module我添加一行就会消失include = ConfigModule.class,但这会让我觉得语义错误,因为a)我将创建的DAG现在将包含两个模块的值,而不仅仅是一个, b)它首先会破坏DI的目的/灵活性,以便链接特定的模块,而不是简单地让Dagger注入适当的值.

我假设我不应该创建一个this只注入它的对象图?但后来我遇到了没有链接特定模块的问题......

简洁:

  • 将值注入一个可能从其他模块提供的模块的"正确"方法是什么?在这里我使用的是现场注入,但是我的构造函数注入实验也导致了很多失败.
  • 相关地,何时适合使用addsTovs. …

java android dependency-injection dagger

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