【问题标题】:Dagger Component Getting From Application Class?匕首组件从应用程序类中获取?
【发布时间】:2020-04-29 04:52:30
【问题描述】:

我是 android 匕首的新手,我需要直接从组件中获取对象,但我需要知道这是正确的做法。
例子 我需要使用匕首注入的类

@Singleton
class Testing @Inject constructor(){

}
@Singleton
@Component(...)
interface AppComponent {
    ...

@Component.Builder
    interface Builder {
        @BindsInstance
        fun application(application: MyApplication): Builder

        fun build(): AppComponent
    }

    fun getTest(): Testing

    fun inject(application: MyApplication)
}
class Myapplication : Application(){

    lateinit var appComponent : AppComponent

    override fun onCreate() {
        super.onCreate()
        initializeDagger()
    }

    private void initializeDagger() {
        appComponent = DaggerAppComponent.builder()
                .application(this)
                .build();
        appComponent.inject(this);

    }
}

用于获取注入的类,即Testing

class Tester {

 fun getTesting() : Testing{
   return applicationContext.appComponent.getTest()
 }
}

我需要知道这是正确的做法还是有任何其他替代解决方案可用?
谁能帮我解决这个问题?

【问题讨论】:

    标签: java android kotlin dagger-2


    【解决方案1】:

    我认为你可以使用@Inject lateinit var test: Testing,而不是使用getTest()。此外,您需要创建另一个inject() 函数来接收您的课程并在您的课程中使用DaggerAppComponent.create().inject(this)。 Dagger 会自动为你注入。

    欲了解更多信息,请查看this page。它具有 Dagger 的基本功能。

    无论如何,Dagger 2 还有另一种实现方式,您甚至不需要在类中包含inject()

    编辑:这是我关于简单匕首的代码

    class Info @Inject constructor(){
        val text = "Dagger2"
    }
    
    @Component()
    interface InfoComponent {
        fun inject(app: MainActivity)
        fun inject(box: Box)
    }
    
    class Box {
        @Inject
        lateinit var info: Info
    
        init {
            DaggerInfoComponent.create().inject(this)
        }
    
        fun getInfo(): String {
            return info.text
        }
    }
    
    class MainActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            val box = Box()
            hello_text.text = box.getInfo()
        }
    }
    
    

    您还可以搜索更多关于 AndroidInjector 的信息,使用它您无需在需要注入的每个类中显式插入 inject() 函数

    【讨论】:

    • 在您的代码中,您可以将Testing 对象直接注入您需要的位置。我认为您不必从 Tester 类创建 getter 方法 getTesting()
    • 是否可以注入Testing而不使类成为可注入的,即我将手动创建测试器对象,但我需要用匕首注入测试。
    • 你想注入 POJO 类吗?你不能在里面使用inject(class)
    • 我的意思是示例。 Tester().getTesting() 但在 Tester 类中,我将使用 @Inject 注入测试类,这可能吗?
    • 我将编辑我的答案。你应该检查它是否是你需要的
    猜你喜欢
    • 2020-10-02
    • 2019-11-18
    • 2018-01-17
    • 2021-12-29
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多