Начиная Dagger2, Как построить структуру? - PullRequest
1 голос
/ 08 января 2020

Я сейчас изучаю Dagger2. Я учусь, глядя на несколько примеров. Но есть некоторые части, которые не работают должным образом, глядя на примеры. Я знаю, что структура Dagger2 должна быть определена и реализована в порядке приложения -> активный -> пользовательский компонент. Тем не менее, произошла ошибка при этом. сообщение java.lang.RuntimeException: android.app.Application does not implement dagger.android.HasActivityInjector Код длинный, но я sh кто-нибудь появится, чтобы помочь мне. Я очень отчаялся.

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
    }
}

Утилиты

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
    }
}

Ответы [ 2 ]

0 голосов
/ 13 января 2020

Я смог решить эту проблему, добавив android:name=".BaseApplication" на 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>
0 голосов
/ 08 января 2020

Сделать класс приложения реализующим HasActivityInjector

Класс UserApplication расширяет приложение реализует HasActivityInjector {}

...