Tag: 依赖注入

我如何提供匕首依赖的活动上下文?

我如何在mainModule类中提供活动上下文? 谢谢! 代码如下所示: @Singleton @Component(modules = {AndroidInjectionModule.class, AppModule.class, ActivityBuilder.class}) public interface AppComponent { @Component.Builder interface Builder { @BindsInstance Builder application(Application application); AppComponent build(); } void inject(MvmApp app); } 活性建造者: @Module public abstract class ActivityBuilder { @ContributesAndroidInjector(modules = {MainModule.class}) abstract MainActivity bindMainActivity(); } 我有一个appModule,并为每个活动模块: @Module public class AppModule { @Provides @Singleton @ApplicationContext Context provideContext(Application application) { […]

绑定到KClass类型的地图

我想通过它们的KClass类型将ViewModel子类绑定到一个地图中: @Module abstract class ViewModelModule { @Binds @IntoMap @ViewModelKey(MyViewModel::class) abstract fun bindsMyViewModel(viewModel: MyViewModel): ViewModel @Binds abstract fun bindViewModelFactory(factory: ViewModelFactory): ViewModelProvider.Factory } 但是我得到了Dagger编译错误: e: ~/Example/app/build/tmp/kapt3/stubs/debug/com/example/app/injection/AppComponent.java:5: error: [dagger.android.AndroidInjector.inject(T)] java.util.Map<kotlin.reflect.KClass<? extends android.arch.lifecycle.ViewModel>,? extends javax.inject.Provider<android.arch.lifecycle.ViewModel>> cannot be provided without an @Provides-annotated method. e: e: public abstract interface AppComponent { e: ^ e: java.util.Map<kotlin.reflect.KClass<? extends android.arch.lifecycle.ViewModel>,? extends javax.inject.Provider<android.arch.lifecycle.ViewModel>> is injected […]

AndroidInjector <android.app.Activity>不能提供@ Provide或者@ Produces注解的方法

我在尝试从Dagger v2.11中获取新的Android Dagger类时遇到了错误。 我不确定问题是什么,因为我已经考虑到了https://google.github.io/dagger//android.html上的Android文档,仍然无法解决这个问题。 有关这个设置有什么问题的任何想法? 我的应用程序: public class MyApplication extends Application implements HasActivityInjector { @Inject AndroidInjector<Activity> androidInjector; @Override public void onCreate() { super.onCreate(); AppInjector.init(this); } @Override public AndroidInjector<Activity> activityInjector() { return androidInjector; } } AppComponent: @Singleton @Component(modules = { AndroidSupportInjectionModule.class, AppModule.class, ActivityModule.class, }) public interface AppComponent { @Component.Builder interface Builder { @BindsInstance Builder application(Application application); […]

为什么不是Guice找到我的List <Interface>绑定?

我有一个接口与几个实现: interface PuNoManager { fun notifyUser(userId: Int) } class FcmManager @Inject constructor(val fcmClient: FcmClient) : PuNoManager { override fun notifyUser(userId: Int) { … } } class ApnsManager @Inject constructor(val apnsClient: ApnsClient) : PuNoManager { override fun notifyUser(userId: Int) { … } } 哪些都绑定在我的Module ,以及@Provides -annotated方法来获取List<PuNoManager> : class PuNoModule: AbstractModule() { override fun configure() { bind(ApnsManager::class.java) […]

牙签不注入依赖关系

我正在尝试用于依赖注入的牙签库,它比其他的更容易使用和测试。 但是,当我运行代码时,我正面临着一个问题,牙签没有注入任何东西。 我现在只是使用它,这是有点难以弄清楚。 我正在使用Kotlin,Android Studio 2.3.3和Gradle 2.3.3,这里是我的代码: 的build.gradle //KOTLIN_VERSION=1.1.4 //TOOTHPICK_VERSION=1.0.8 compile "com.github.stephanenicolas.toothpick:toothpick-runtime:$TOOTHPICK_VERSION" compile "com.github.stephanenicolas.toothpick:smoothie:$TOOTHPICK_VERSION" kapt "com.github.stephanenicolas.toothpick:toothpick-compiler:$TOOTHPICK_VERSION" class AppModule : Module { constructor(application: Application) { bind(QuestionRepository::class.java).toInstance(QuestionRepository(application)) } } class MyApp : Application() { override fun onCreate() { super.onCreate() setupInjector() } fun setupInjector() { val appScope = Toothpick.openScope(this) appScope.installModules(SmoothieApplicationModule(this), AppModule(this)) if (BuildConfig.DEBUG) { Toothpick.setConfiguration(Configuration.forDevelopment()); } } } […]

匕首2错误:依赖“不能提供没有@Inject构造函数”

我试图在我的Android项目中使用Dagger 2。 对于初学者,我想利用两个组件分别负责注入应用程序范围和活动范围的依赖关系。 作为一个基本的参考,我使用了这个答案 。 所以有两种不同的方式来设置组件之间的关系:使用@Subcomponent注解和dependencies参数。 如果我去第一个,我的AppContextComponent工作正常。 但只要我尝试从ActivityContextComponent注入依赖项,我得到这个生成时间错误: 错误:com.example.ui.activity.MainActivity不能提供@Inject构造函数或@提供 – 或@ Produces注释的方法。 第二种方法,我得到这个错误的所有依赖。 知道我有提供方法,这个错误信息是坦率地没有用。 这里有一些其他可能的来源,我已经设法谷歌这个错误,但他们似乎并非如此: 范围问题 。 由于来自不同提供方法的返回类型相同而引起歧义 (即使删除提供Context 方法 ,问题仍然存在)。 下面的代码是在Kotlin中,但我认为它应该是非常简单的。 应用程序组件 object AppContext { // a singleton used in place of a Java static field @JvmStatic lateinit var graph: AppContextComponent } @ApplicationScope @Component(modules = arrayOf(AppContextModule::class)) interface AppContextComponent { fun inject(fragment: BaseFragment) fun newActivityContextComponent(module: […]

使用@ Component.Builder和构造函数参数

我试图学习匕首,kotlin和mvvm,所以如果这个问题很奇怪,请原谅我。 如果我有一个NetworkModule,基本上提供了翻新的应用程序,我认为这是一个好主意,传入基础的网址,我们要建立翻新。 我可以通过传入应用程序的组件构建函数来以旧的方式来做到这一点,但不能通过@ Component.Builder方法来解决这个问题。 尝试: App.kt DaggerAppComponent.builder() .application(this) .networkModule(BuildConfig.BASE_URL) .build() .inject(this) AppComponent.kt @Singleton @Component(modules = arrayOf( AppModule::class, NetworkModule::class, AndroidInjectionModule::class, ActivityBuilder::class)) interface AppComponent { @Component.Builder interface Builder { @BindsInstance fun application(application: Application): Builder @BindsInstance fun networkModule(baseUrl: String): Builder fun build(): AppComponent } fun inject(app: App) } NetworkModule.kt @Module class NetworkModule(baseUrl: String) { //Attempt to force a […]

随着Kodein依赖注入,我不想传遍各处的kodein实例

使用Kodein,我发现我必须传递kodein实例,或者将它们注入到模块和类中。 但是有时候我有一些课程是非常孤立的,我希望他们能够发现“一个真正的Kodein”。 由于这是一个服务器端应用程序,我只有一个Kodein范围应该很容易。 我可以创建一个全局对象,比如: val kodeinGlobal: Kodein = Kodein { … } 但是,当一些模块在不同的项目中被重复使用时,这是行不通的,我们不能轻易地分享这个例子。 也许一个单独的模块只是举行全球工作,但那么它将需要一个var ,我宁愿它不能改变。 Kodein可以自己发现一个主要的,顶级的或全球性的范围吗? 注意: 这个问题是由作者故意编写和回答的( 自我回答问题 ),所以对于常见的Kotlin / Kodein主题的习惯性的回答是存在于SO中的。

将限定符传递给提供者方法

我有一个自定义限定符,需要参数 – 枚举值。 枚举值包含特定于所需实例构造的信息。 如果我要添加新的枚举值,它会导致在模块中相同的样板代码,如下所示: 预选赛(JAVA): @Documented @Qualifier @Retention(RUNTIME) public @interface Format { Type value() default SYSTEM; enum Type { UI("dd-MM-yyyy HH:mm"), UI_DATE("EEEE,\u00A0dd MMMM yyyy"), . . . private String format; public String getFormat() { return format; } Type(String formatString) { format = formatString; } } } 模块(科特林): @Module class DateTimeModule { @Provides @Format(Format.Type.UI) fun […]

在Kodein依赖注入中,如何将Kodein本身的实例注入实例?

在Kodein中,我将模块导入到父模块中,有时这些类需要Kodein的一个实例,以便稍后进行注入。 问题是这个代码: val parentModule = Kodein { import(SomeService.module) } SomeService.module稍后需要Kodein实例,但Kodein尚未创建。 稍后将它传递给模块似乎是一个坏主意。 在Kodein 3.x我看到有一个全局实例的kodein-conf模块,但我想避免全局。 其他模块或类如何获得Kodein实例? 注意: 这个问题是由作者故意编写和回答的( 自我回答问题 ),所以对于常见的Kotlin / Kodein主题的习惯性的回答是存在于SO中的。