Проблема с инъекционной деятельностью (Dagger2) - PullRequest
0 голосов
/ 16 февраля 2020

Я пытался внедрить свою активность, и по какой-то причине она, похоже, не работает. Кажется, это не работает, если я расширяю свою деятельность из DaggerAppCompatActivity или напрямую внедряю HasAndroidInjector в свою деятельность.

Ошибка

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mydemoapplication/com.example.accountcreationmodule.TestActivity}: java.lang.IllegalArgumentException: No injector factory bound for Class<com.example.accountcreationmodule.TestActivity>
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
     Caused by: java.lang.IllegalArgumentException: No injector factory bound for Class<com.example.accountcreationmodule.TestActivity>
        at dagger.android.DispatchingAndroidInjector.inject(DispatchingAndroidInjector.java:136)
        at dagger.android.AndroidInjection.inject(AndroidInjection.java:181)
        at dagger.android.AndroidInjection.inject(AndroidInjection.java:55)
        at dagger.android.support.DaggerAppCompatActivity.onCreate(DaggerAppCompatActivity.java:41)
        at com.example.accountcreationmodule.TestActivity.onCreate(TestActivity.kt:9)
        at android.app.Activity.performCreate(Activity.java:7802)
        at android.app.Activity.performCreate(Activity.java:7791)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)

Компонент

@Singleton
@Component(
    modules = [
        AccountCreationActivityBuilderModule::class,
        AndroidInjectionModule::class],
    dependencies = [AccountCreationFeature.Dependencies::class]
)
interface AccountCreationComponent : AndroidInjector<AccountCreationFeatureImpl> {

    @Component.Factory
    interface Factory {
        fun create(
            @BindsInstance testFeatureImpl: AccountCreationFeatureImpl,
            accountCreationFeature: AccountCreationFeature.Dependencies
        ): AccountCreationComponent
    }
}

AccountCreationFeatureImpl

class AccountCreationFeatureImpl : AccountCreationFeature {

    private lateinit var accountCreationComponent: AccountCreationComponent

    override fun inject(dependencies: AccountCreationFeature.Dependencies) {
        if (::accountCreationComponent.isInitialized) {
            return
        } else{
            accountCreationComponent = DaggerAccountCreationComponent.factory().create(this, dependencies)
        }
    }
}

ActivityBuilderModule

@Suppress("unused")
@Module
abstract class AccountCreationActivityBuilderModule {

    @ContributesAndroidInjector(modules = [AccountCreationFragmentBuilderModule::class])
    abstract fun contributeTestActivity(): TestActivity
}

FragmentBuilderModule

@Suppress("unused")
@Module
abstract class AccountCreationFragmentBuilderModule {

    @ContributesAndroidInjector
    abstract fun contributesTestFragment(): TestFragment
}

Активность

class TestActivity : DaggerAppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_test)
    }
}

Фрагмент

class TestFragment : DaggerFragment() {

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_blank, container, false)
    }
}
...