1

I am studying Dagger2 now. I am studying by looking at several examples. But there are some parts that aren't working properly, looking at the examples. I know that the structure of Dagger2 should be defined and implemented in the order of application -> active -> user component. However, an error occurred when following this. the message is java.lang.RuntimeException: android.app.Application does not implement dagger.android.HasActivityInjector The code is long, but I wish someone would show up to help me. I am very desperate.

AppComponent

@Singleton 
@Component(modules = [AndroidSupportInjectionModule::class,
                      ActivityBindingModule::class,
                      ApplicationModule::class]) 
interface AppComponent : AndroidInjector<BaseApplication> {

    @Component.Builder
    interface Builder {
        @BindsInstance
        fun application(application: Application): Builder
        fun build(): AppComponent
    }
}

BaseApplication

class BaseApplication : DaggerApplication() {
     override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
        return DaggerAppComponent.builder().application(this).build()
    }
}

ActivityScope

@Scope
annotation class ActivityScope

ActivityBindingModule

@Module
abstract class ActivityBindingModule {

    @ContributesAndroidInjector(modules = [MainModule::class])
    abstract fun mainActivity(): MainActivity

}

MainModule

@Module
class MainModule {
    @ActivityScope
    @Provides
    fun util() : Utils = Utils()

}

ApplicationModule

@Module
class ApplicationModule {
    @Provides
    fun providesContext(application: Application): Context {
        return application
    }
}

Utils

class Utils {
    @Inject constructor(){
    }
    fun add(a :Int, b:Int):Int= a+b
    fun sub(a :Int, b:Int):Int= a-b
    fun div(a :Int, b:Int):Int= a/b
    fun mul(a :Int, b:Int):Int= a*b

}

MainActivity

class MainActivity : DaggerAppCompatActivity(), HasActivityInjector {

    lateinit var utils : Utils

    @Inject
    lateinit var activityDispatchingAndroidInjector: DispatchingAndroidInjector<Activity>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        var aa = utils.add(10,20)

        Log.d("TAG",""+aa)

    }

    override fun activityInjector(): AndroidInjector<Activity> {
        return activityDispatchingAndroidInjector
    }
}
Jimmar
  • 4,194
  • 2
  • 28
  • 43
jakchang
  • 402
  • 5
  • 13

2 Answers2

0

Make application class implement HasActivityInjector

class UserApplication extends Application implements HasActivityInjector{ }

0

I able to solved this problem by adding android:name=".BaseApplication" at AndroidManifest.xml

<application
    android:name=".BaseApplication"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".AuthActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>
khoi
  • 940
  • 1
  • 14
  • 29