Tag: 依赖注入

Android Dagger:我无法提供没有@Inject构造函数的外部类

编辑 解决了这个问题。 看到我的帖子下面。 我正在使用Dagger和Kotlin编写一个Android应用程序。 我想将java.text.SimpleDateFormat类注入到我的类DateHelper @Singleton class DateHelper @Inject constructor(var dateFormat: SimpleDateFormat) { … } 我有一个模块,其中@Provides SimpleDateFormat 。 @Module class DateModule { @Singleton @Provides fun dateFormat(): SimpleDateFormat { return SimpleDateFormat("yyyy-MM-dd", Locale.US) } } 和一个Dagger组件: @Singleton @Component(modules = arrayOf(MyAppModule::class, DateModule::class)) interface MyAppComponent { … } 最后我的Application : open class MyApplication : Application() { private lateinit var […]

Guice MapBinder

我在Java + Kotlin项目中使用Guice将算法实现的映射注入到特定的bean中,但是我一直在获取 1) No implementation for java.util.Map<java.lang.String, ? extends com.scherule.scheduling.algorithms.SchedulingAlgorithm> annotated with @com.google.inject.name.Named(value=scheduling.algorithms) was bound. while locating java.util.Map<java.lang.String, ? extends com.scherule.scheduling.algorithms.SchedulingAlgorithm> annotated with @com.google.inject.name.Named(value=scheduling.algorithms) for the 2nd parameter of com.scherule.scheduling.SchedulingJobConsumer.<init>(SchedulingJobConsumer.kt:17) while locating com.scherule.scheduling.SchedulingJobConsumer 模块的定义是这样定义的: class AlgorithmsModule : AbstractModule() { override fun configure() { MapBinder.newMapBinder(binder(), String::class.java, SchedulingAlgorithm::class.java, Names.named("scheduling.algorithms") ).addBinding("interval-projection").toInstance(IntervalProjectionAlgorithm()) } } 而来电号码是: @Singleton class SchedulingJobConsumer […]

尝试使用Dagger2和Kotlin将ViewModelProvider注入到Activity时出错

在尝试将ViewModelProvider.Factory注入到Activity时收到以下错误: e: D:\AndroidStudioProjects\VolleyballStats\app\build\tmp\kapt3\stubs\debug\com\example\kamil\volleyballstats\di\AppComponent.java:6: error: [dagger.android.AndroidInjector.inject(T)] java.util.Map<java.lang.Class<? extends android.support.v4.app.Fragment>,javax.inject.Provider<dagger.android.AndroidInjector.Factory<? extends android.support.v4.app.Fragment>>> cannot be provided without an @Provides-annotated method. e: e: public abstract interface AppComponent extends dagger.android.AndroidInjector<com.example.kamil.volleyballstats.VolleyballStatsApp> { e: ^ e: java.util.Map<java.lang.Class<? extends android.support.v4.app.Fragment>,javax.inject.Provider<dagger.android.AndroidInjector.Factory<? extends android.support.v4.app.Fragment>>> is injected at e: dagger.android.DispatchingAndroidInjector.<init>(injectorFactories) e: dagger.android.DispatchingAndroidInjector<android.support.v4.app.Fragment> is injected at e: dagger.android.support.DaggerAppCompatActivity.supportFragmentInjector e: com.example.kamil.volleyballstats.views.main.MainActivity is injected at e: dagger.android.AndroidInjector.inject(arg0) 我创建了非常标准的Dagger2实现,如下所示: @Singleton […]

匕首在基类中注入接口

我想在抽象类构造函数中注入接口实现,并在子类中使用它。 我有编译时间错误: Error:Gradle: Dagger does not support injection into private fields Error:Gradle: Example.A cannot be provided without an @Provides-annotated method. Error:Gradle: Example.B cannot be provided without an @Inject constructor or from an @Provides-annotated method. Error:Gradle: Execution failed for task ':app:compileDemoDebugJavaWithJavac'. > Compilation failed; see the compiler error output for details. 在kotlin中的例子。 object Example { interface […]

MVP演示者没有正确注入

我正在学习Kotlin和Dagger 2,试图将一些Mindorks高级MVP样本转换成Kotlin,但是我有Dagger2编译问题。 我在这里上课,但是非常接近! 不要介意这个不整洁的东西,我打算在编译完成之后再梳理每个类。 如果有什么遗漏,请让我知道。 错误归结为我的演示者类未正确注入到活动中。 错误如下所示: e: D:\_Dev\repo\app\build\tmp\kapt3\stubs\debug\com\xxx\di\component\ActivityComponent.java:8: error: com.xxx.login.LoginMVP.Presenter<com.xxx.login.LoginMVP.View,? extends com.xxx.login.LoginMVP.Interactor> cannot be provided without an @Provides- or @Produces-annotated method. e: e: public abstract void inject(@org.jetbrains.annotations.NotNull() e: ^ e: com.xxx.login.LoginMVP.Presenter<com.xxx.login.LoginMVP.View,? extends com.xxx.login.LoginMVP.Interactor> is injected at e: com.xxx.login.LoginActivity.presenter e: com.xxx.login.LoginActivity is injected at e: com.xxx.di.component.ActivityComponent.inject(activity) e: java.lang.IllegalStateException: failed to analyze: org.jetbrains.kotlin.kapt3.diagnostic.KaptError: Error while annotation […]

Dagger2 – FragmentSubcomponentBuilder没有实现AndroidInjector.Factory

我正在使用匕首2并试图将我的Android项目从Java转换为Kotlin。 成功构建后,我得到运行时错误: MyFragmentSubcomponentBuilder没有实现AndroidInjector.Factory 用Java这个错误没有出现。 我还注意到,在我的ActivityBuilder模块中,所有方法在构建之后都是未使用的(它们必须在生成的子组件类中使用)。 @Module abstract class ActivityBuilder { // … @ContributesAndroidInjector(modules = arrayOf(MainActivityModule::class,MyFragmentProvider::class)) internal abstract fun bindMainActivity(): MainActivity // this method highlighted with gray color in AndroidStudio as unused } 我如何设置我的项目正确使用匕首2和kotlin? 我的顶级gradle.build: buildscript { ext.kotlin_version = '1.1.51' repositories { jcenter() maven { url 'https://maven.google.com' } mavenCentral() google() maven { url 'https://github.com/uPhyca/stetho-realm/raw/master/maven-repo' } maven […]

在Kotlin中使用基于注释的依赖注入时,哪种语法是优选的?

我们正在使用现有的框架,其中包括通过注释提供依赖注入。 在Java中,要注入字段值,我们可以这样做: @Inject private SomeService someService; 由于反射允许重新分配通常是最终的字段,所以这也是一个有效的声明: @Inject private final SomeService someService = null; 为了使声明更短(也使单元测试类中的字段可用,同时使它们成为半私有API的一部分),可以这样做: @Inject SomeService someService; @Inject final SomeService someService; 当谈到Kotlin时,我们一直在坚持: @Inject private var someService: SomeService? = null @Inject private lateinit var someService: SomeService 可空类型的方法在每个服务使用上都需要额外的空检查(或者!!运算符),即使我们100%确定它们永远不会为空 – 除非出现完全错误,在这种情况下,我们会遇到更大的问题。 lateinit方法似乎在运行时执行不必要的检查(这很可能不会成为性能瓶颈,但仍然是),而且相当冗长。 两种方法都允许将变量重新分配给另一个值。 我们还没有找到一种方法,用val替换var ,而不必重写getter或使用备份字段,它将面临同样的问题。 具有讽刺意味的是,在许多情况下,它们都比Java声明长。 那么 – 声明注释的Kotlin字段的首选方法是什么,它将被自动注入,我们100%确定它们永远不会为空? 虽然我知道有多个Kotlin友好的语法解决类似的问题(如Injekt )的框架,我问是否有更好的方法来处理我们所拥有的问题。

如何将IoC注入到Kotlin顶级函数中? 我甚至使用IoC容器?

我很难遵循FP。 当人们说“更习惯风格”时,我必须明白:99%的Java库不适用于Kotlin和Scala的FP惯用风格吗? 那么,我需要Spring Boot来快速启动Vaadin。 所以我需要注入一些豆子。 package com.x.ui import com.vaadin.icons.VaadinIcons import com.vaadin.navigator.Navigator import com.vaadin.ui.MenuBar fun createMenuBar(navigator: Navigator): MenuBar { val menuBar = MenuBar() menuBar.setHeight(null) menuBar.setWidth(null) menuBar.addItem("Dashboard", VaadinIcons.COG, { navigator.navigateTo("Dashboard") } as MenuBar.Command) return menuBar } 那么如何将SpringNavigator注入到这个函数中呢? 由于我已经有几个顶级功能,所以我没有@Component既没有@Bean,也没有使用Spring IoC for Kotlin的惯用方法? 我仅限于使用课程,或者我们有技巧做到这一点?

Kotlin与Spring DI:lateinit属性尚未初始化

我没有在Kotlin中获得基于Spring的setter依赖注入,因为它总是以“lateinit属性API尚未初始化”的错误消息终止。 我可以将问题减少到以下情况:有一个接口 interface IApi { fun retrieveContent(): String } 这是通过 class Api : IApi { override fun retrieveContent() = "Some Content" } 我想在另一个类中使用依赖注入应该发生的实现: @Component class SomeController { @Autowired lateinit var api: IApi fun printReceivedContent() { print(api.retrieveContent()) } } 但是,应用程序终止与上述错误信息。 我的Spring配置如下所示: @Configuration open class DIConfig { @Bean open fun getApiInstance(): IApi = Api() } 在主函数中加载应用程序上下文并调用方法: fun […]

用匕首使用Kotlin

使用Dagger向类中注入依赖关系的最好方法是什么,特别是像Dagger这样的零参数构造函数类,比如Activities? 匕首2可能会改善情况吗? 提前致谢。