Неправильный график в Dagger 2 с котлином - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь использовать Dagger 2 с Kotlin, и мне чего-то не хватает. Проблема возникает, когда я пытаюсь внедрить докладчика MVP в Fragment.

Это мои файлы:

AppClass

class AppClass : Application(), HasActivityInjector {

    @Inject
    lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Activity>

    override fun onCreate() {
        super.onCreate()

        DaggerAppComponent.builder()
            .application(this)
            .build()
            .inject(this)
    }

    override fun attachBaseContext(base: Context) {
        super.attachBaseContext(base)
        MultiDex.install(this)
    }

    override fun activityInjector(): AndroidInjector<Activity> = dispatchingAndroidInjector

    companion object {
        lateinit var instance: AppClass private set
    }
}

AppComponent

@Singleton
@Component(modules = [AndroidSupportInjectionModule::class,
                    AppModule::class,
                    ActivityBuilder::class])
interface AppComponent {

    fun inject(appClass: AppClass)

    @Component.Builder
    interface Builder {

        @BindsInstance
        fun application(appClass: AppClass): Builder

        fun build(): AppComponent
    }
}

AppModule

@Module
class AppModule {

    @Provides
    @Singleton
    fun provideContext(app : AppClass) = app

    @Provides
    @Singleton
    fun provideDatabaseManager() = DatabaseManager()
}

ActivityBuilder

@Module
abstract class ActivityBuilder {

    @ContributesAndroidInjector(modules = [ActivityModule::class, HomeFragmentProvider::class])
    internal abstract fun bindHomeActivity(): HomeActivity
}

HomeFragmentProvider

@Module
public abstract class HomeFragmentProvider {

    @ContributesAndroidInjector(modules = HomeFragmentModule.class)
    abstract HomeFragment provideHomeFragmentFactory();
}

HomeFragmentModule

@Module
class HomeFragmentModule {

    @Provides
    fun provideHomePresenter(databaseManager: DatabaseManager): HomeContract.Presenter {
        return HomePresenter(databaseManager)
    }
}

HomeFragment

class HomeFragment : HomeContract.View {

    @Inject lateinit var mPresenter: HomeContract.Presenter

    override fun onCreate(savedInstanceState: Bundle?) {
        AndroidSupportInjection.inject(this)
        super.onCreate(savedInstanceState)

        if (arguments != null) {
        }
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val view = inflater.inflate(R.layout.fragment_home, container, false)

        return view
    }

    companion object {

        private val STARTING_PAGE_INDEX = 0

        fun newInstance(): HomeFragment {
            val fragment = HomeFragment()
            val args = Bundle()
            fragment.arguments = args
            return fragment
        }
    }
}

Вход

...app/build/tmp/kapt3/stubs/debug/.../di/component/FragmentComponent.java:9: error: [Dagger/MissingBinding] ....HomeContract.Presenter cannot be provided without an @Provides-annotated method.

Я пытаюсь вставить DatabaseManager в Activity и работает нормально, поэтому я полагаю, что моя проблема связана с Fragment зависимостями.

Любая помощь приветствуется.

UPDATE HomePresenter

class HomePresenter() :
BasePresenter<HomeContract.View>(), HomeContract.Presenter {

private lateinit var mDatabaseManager : DatabaseManager

@Inject constructor(databaseManager: DatabaseManager) : this() {
    this.mDatabaseManager = databaseManager
}
}

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

Я придумал проблему. Если я изменю инъекцию в HomeFragment с @Inject lateinit var mPresenter: HomeContract.Presenter на @Inject lateinit var mPresenter: HomePresenter, все будет отлично.

0 голосов
/ 19 марта 2019

Определите переменную HomePresenter в качестве параметра функции, как показано ниже:

@Module
class HomeFragmentModule {

    @Provides
    fun provideHomePresenter(homePresenter: HomePresenter): HomeContract.Presenter {
            return homePresenter
    }
}

Измените свой класс HomePresenter, как показано ниже:

class HomePresenter @Inject constructor(val databaseManager: DatabaseManager) :
BasePresenter<HomeContract.View>(), HomeContract.Presenter {
   ....
}

Также вы можете использовать экземпляр DatabaseManagerнепосредственно из конструктора, пометив его как val, нет необходимости определять его отдельно.

В AppComponent попробуйте использовать AndroidInjectionModule::class, если вы не используете вспомогательные фрагменты.

@Singleton
@Component(modules = [AndroidInjectionModule::class,
                    AppModule::class,
                    ActivityBuilder::class])
    interface AppComponent {
        ....
    }

Надеюсь, это решит вашу проблему!

...