Articles of dependency injection

Kotlin错误:Dagger不支持注入私人领域

我在kotlin活动中使用ViewPager,我想在Kotlin Fragment中使用匕首注射。 我有错误:Dagger不支持注入私有字段。 在Java Fragment中匕首注射工作。 为什么我不能在kotlin faragment中注入匕首? 在我的kotlin活动中 mPagerAdapter = object : FragmentPagerAdapter(supportFragmentManager) { private val mFragments = arrayOf(KotlinFragment(), JavaFragment()) private val mFragmentNames = arrayOf(getString(R.string.cashdocuments), getString(R.string.action_absmysql)) override fun getItem(position: Int): Fragment { return mFragments[position] } override fun getCount(): Int { return mFragments.size } override fun getPageTitle(position: Int): CharSequence { return mFragmentNames[position] } } 我的kotlin片段 class […]

Bean和EBean概念Android注释

对不起,我一般都是Android注释和dependency injection的新手。 我试图了解事情的运作方式以及使用Android Annotations获得的好处。 我已经研究过示例,在Android开发中一切都很清楚@EActivity, @ViewById, @App和其他广泛使用的注释。 我对理解Ebean 。 我已经使用spring for Java,很明显我们在xml文件中声明bean并且只是在代码中使用它们,我们可以在xml文件中轻松更改,只提供具体的实现,并且它将在我们使用的任何地方更改来自AppContext的Id的bean。 但我不明白在Android Annotations的情况下使用bean的目的,可能是我一般不理解DI。 @EBean public class MyClass { // … } @EActivity public class MyActivity extends Activity { @Bean MyClass myClass; } 我们在这有什么好处? 我们只省略了myClass = new MyClass(); ? 就这样 ? 另一个例子是Singletone范围。 @EBean(scope = Scope.Singleton) public class MyClass { // … } 在这种情况下我们有一些好处,我们不必手动创建实例,私有构造函数并检查它是否为null(延迟初始化)….. 对于这种情况,我理解它可以节省时间,但在第一个例子中似乎没有任何好处,我们没有xml文件,我们可以在bean之间构建我们的bean依赖关系注释。 请帮我理解这个。 […]

具有命名参数的kotlin中的Dagger 2构造函数注入

我有这种依赖: @Singleton class SpiceMix @Inject constructor(@field:[Named(“oregano”)] private val oregano: Spice, @field:[Named(“sage”)] private val sage: Spice, @field:[Named(“rosemary”)] private val rosemary: Spice) 以及一个实现其依赖关系的模块: @Module class SpiceModule { @Provides @Named(“oregano”) @Singleton fun provideOregano(): Spice = Oregano() @Provides @Named(“sage”) @Singleton fun provideSage(): Spice = Sage() @Provides @Named(“rosemary”) @Singleton fun provideRosemary(): Spice = Rosemary() 然后将SpiceMix注入我的应用程序的不同位置。 但是,这不编译,我收到一个错误: Spice cannot be provided […]

Dagger 2组件依赖项

可以在模块中注入一些东西吗? 我有2个基本模块/组件: @Component(modules = {OkHttpModule.class}) public interface OkHttpComponent extends AppComponent { OkHttpClient provideOkHttpClient(); } @Module public class OkHttpModule { @Provides OkHttpClient provideOkHttpClient() { return mHttpClient; } } @Component(modules = {GsonModule.class}) public interface GsonComponent extends AppComponent { Gson provideGson(); } @Module public class GsonModule { @Provides Gson provideGson() { return mGson; } } 有了这个模块/组件,我想创建第3个模块: @Component(dependencies = […]

可以在Android应用程序中使用Spring Framework吗?

我正在编写一个Android应用程序,它需要在应用程序需要的数据访问API中注入依赖项(我正在实现此API)。 我不想手动编写dependency injection。 因此,我在考虑使用Spring。 我意识到弹簧有两个版本。 常规版和Android版。 可以在android应用程序中使用常规版本,因为我只想要dependency injectionfunction并且已经有了文件。

在Android上使用Dagger 2进行懒惰注射

我是Dagger 2的新手。我有这个场景,我不想在我的应用程序中注入一个对象(在演示者中,在api中) 我最初没办法提供它。 在我的应用程序的某个阶段进行身份validation之后才会创建它。 来自文档http://google.github.io/dagger/ 我看到Lazy加载可能是解决这个问题的一种方法,例如 @Inject Lazy lazyGrinder; 然后使用以下方法获取这样的值:lazyGrinder.get()。grind(); 我的问题是: 我可以安全地用新的对象交换对象吗? 有没有其他推荐的方法来做到这一点? 谢谢

用Dagger注入generics类

我的项目中有一个抽象基类 public abstract class BaseActivity<T extends BasePresenter> implements IBaseView{ 我尝试注入这样的generics类: @Inject protected T mPresenter; 有没有办法让匕首与这种通用注射一起工作? Dagger生成如下代码: public final class BaseActivity$$InjectAdapter extends Binding implements MembersInjector { private Binding mPresenter; } 然后失败因为“T无法解析为某种types”。 有没有办法让它生成一个 Binding mPresenter 在这种情况下?

匕首2单身人士不工作

使用Dagger 2,我试图在单个范围内的多个位置注入单个对象。 但是,似乎我的解决方案每次都会创建一个新实例。 在这个测试项目中,我有一个MainActivity初始化DaggerModule。 DaggerModule提供Box和Cat对象,Box以Cat为参数。 我还在我的MainActivity中接受了Cat。 最后,我检查了注入的两个Catvariables的引用(分别在Box和MainActivity中),但它们不是同一个实例。 如果我在MainActivity中调用了两次provideCat(),则会提供相同的实例。 主要活动: public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); DaggerModule daggerModule = new DaggerModule(); DaggerComponent daggerComponent = Dagger_DaggerComponent.builder() .daggerModule(daggerModule).build(); // Same Cat instance returned. Cat cat1 = daggerComponent.provideCat(); Cat cat2 = daggerComponent.provideCat(); Log.d(“=== cat1: “, cat1.toString()); Log.d(“=== cat2: “, cat2.toString()); // […]

Android Dagger更新模块外的值

我在Android应用程序中使用dagger for DI。 我可以为模块外的其他类提供variables, 但是如何更新它们呢? 示例:登录 我需要一个可以提供用户的AuthenticationModule。 应用程序启动时,用户未登录,因此为空。 但在成功进行身份validation后,LoginActivity需要设置User的值,以便通过AuthenticationModule通过应用程序的其他部分访问它。 简单地设置注入场的值对我来说不起作用。 它甚至可能吗?

使用Dagger 2 + Kotlin + ViewModel注入ViewModel

class SlideshowViewModel : ViewModel() { @Inject lateinit var mediaItemRepository : MediaItemRepository fun init() { What goes here? } 所以我正在尝试学习Dagger2,这样我就可以让我的应用程序更加可测试。 问题是,我已经集成了Kotlin并正在研究Android Architectural组件。 我理解构造函数注入是首选,但ViewModel无法做到这一点。 相反,我可以使用lateinit来注射,但我不知道如何注射。 我是否需要为SlideshowViewModel创建一个Component ,然后注入它? 或者我使用Application组件? gradle这个: apply plugin: ‘com.android.application’ apply plugin: ‘kotlin-android’ kapt { generateStubs = true } dependencies { compile “com.google.dagger:dagger:2.8” annotationProcessor “com.google.dagger:dagger-compiler:2.8” provided ‘javax.annotation:jsr250-api:1.0’ compile ‘javax.inject:javax.inject:1’ } 应用组件 @ApplicationScope @Component (modules = […]