当前位置: 首页 > 知识库问答 >
问题:

Dagger2在没有@Inject构造函数的情况下注入ViewModel

罗星洲
2023-03-14

我有很多Android ViewModel类,它们往往有很多依赖项(大多数是Room中的DAO,每个SQLite表一个)。有些依赖项超过10个。

这很好,但Inject构造函数充满了参数,并且只包含样板代码,用于从构造函数参数设置注入的成员。

我想切换到“常规”注入成员,使用@Inject注释单独标识,就像其他(哑)类一样。

这对于与Android相关的类(尽管ViewModel被宣传为非Android依赖,例如它们不使用Android框架)(例如活动和片段)失败。

解决方法是使用工厂,它是使用漂亮的HasActivityInjectorHasServiceInjector等接口从Application类注入的。

Dagger不提供任何HasViewModelInjector,因此如果我坚持单独注入成员而不是注入构造函数,我得到的是:

错误:[dagger.android.AndroidInjector.inject(T)]如果没有@Inject构造函数或@Provides-anttated方法,则无法提供XXXViewModel。此类型支持成员注入,但不能隐式提供。

如果我创建了一个模块,该模块具有提供注释来创建ViewModel,那么它不会注入单个成员。

我错过了什么(我的最后一句话是我的问题中最重要的)还是根本不可能注入成员,我必须注入构造函数?

一点代码。

我想要的:

class MyViewModel extends ViewModel {
    @Inject
    MyDao myDao;
}

与我需要做的相比:

class MyViewModel extends ViewModel {
    private final MyDao myDao;

    @Inject
    MyViewModel(MyDao myDao) {
        this.myDao = myDao;
    }
}

第一块代码(我想要的)需要在模块中使用此方法:

@Provides
MyViewModel provideMyViewModel() {
    return new MyViewModel();
}

但在这种情况下,myDao字段为空。如何注入带注释的成员?

如果我需要注入大量成员,我想避免使用第二块代码,这往往会创建一个包含许多参数的庞大构造函数。

共有1个答案

关翰
2023-03-14

有多种注入方式,我想你指的是字段注入。与构造函数注入不同,字段注入必须手动触发。为此,请在组件中定义一个以视图模型为参数的方法。

void inject(ViewModel viewModel)

然后从视图模型构造函数调用这个方法。

class MyViewModel extends ViewModel {
    private final MyDao myDao;

    @Inject
    MyDao myDao;

    public MyViewModel() {
        MyComponent mycomponent = DaggerMyComponent.....
        myComponent.inject(this);
    }
}
 类似资料:
  • 我试图了解DI在我们的代码库(Kotlin)中是如何使用的。我们正在使用googleguice进行依赖注入。 下面是一个示例类: 在模块类中: DepB类别: 据我所知,对于用< code>@Inject注释的变量,Google Guice会使用模块类来解决这些依赖关系。所以< code>DepA对象的注入方式是有意义的。 但是呢?我们如何能够在不指定任何位置的情况下注入DepB?

  • //模块 //组件 `//预登录Presenter //预物流活动` //在一次创建中 //错误日志 错误:(18,53)错误:找不到符号类DaggerPresentComponent错误:(19,53)错误:找不到符号类DaggerUserLoginComponent错误:(19,10)错误:gorick.gradesprojectandroid.MVP. Presenter. Presente

  • 问题内容: 如果你看一下课堂上的代码,我有两个问题: 服务器启动时,如果我在此类的构造函数中放置一个断点,就像在构造函数中那样,它是由spring使用配置的bean 提供的。但是,构造函数上没有注释,那么,在这个世界中如何以正确的依赖关系调用该构造函数?应该是null。 这是Spring Boot的自动假设吗? Spring是否看到“私有字段+构造函数参数”,并且假定它应该寻找合适的bean? 是

  • 问题内容: 我正在尝试在我的项目中实现dagger2,但遇到错误“ android.app.Application必须在没有@Inject构造函数或@Provides注释方法的情况下才能提供 ”。 这是我的代码: App.java di / AppModule.java di / AppComponent.java di / TestClassModule.java di / TestClassC

  • 我有一个单例类定义为: 我有另一个类使用这个单例类,但这个类必须使用新操作符创建。因此,我不能使用构造函数注入或setter注入等。 我当然可以将此实例传递到MyClass的构造函数中,但从我的程序上下文来看,这不是一个很好的设计。 另一个解决方案是为MySingletonClass创建一个静态getInstance方法,这样我就可以从程序中的任何地方获取实例。但我想知道Guice是否支持类似的东

  • 有人能帮助实现没有注释的Guice吗? pom。xml 我所尝试的: 我得到的错误是: 我理解这个错误。 但是我希望我可以“指向”Guice到正确的构造函数......而不是使用注释。 如您所见,使用默认/空构造函数不是一个好选择,因为这个示例很简单,但我想坚持使用基于构造函数的注入。 附加: 根据我在评论中从赫曼特·辛格那里得到的“暗示”,我想我离得更近了。 我创建了一个ProductionIn