Как использовать передать действие модулю кинжала, используя новый `dagger-android` - PullRequest
0 голосов
/ 20 апреля 2019
Android Studio 3.4
dagger-android 2.21

Как использовать, передайте activity в модуль кинжала, используя новую dagger-android

Перед использованием более старой версии кинжала мы можем передать Activity в конструкторе и вернуть ее вметод провайдера.Но я не уверен, как это сделать с dagger-android

У меня есть следующий модуль.Тем не менее, кинжал сейчас не о ForecastActivity.

@Module
class ActivityModule {
    @Reusable
    @Provides
    fun provideRetryListener(forecastActivity: ForecastActivity): RetryListener {
        return forecastActivity
    }
}

RetryListener - это интерфейс, который реализует ForecastActivity.Я хочу иметь возможность вставить этот RetryListener в мой RetryFragment, т. Е.

class RetryFragment : Fragment() {
    @Inject
    lateinit var retryListener: RetryListener // Inject here

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        AndroidSupportInjection.inject(this)

    super.onCreateView(inflater, container, savedInstanceState)

    retryListener.onRetry() // usage like this
        return inflater.inflate(R.layout.failurecase_layout, container, false)
    }
}

В прогнозе Activity

class ForecastActivity : AppCompatActivity(), RetryListener {

    @Inject
    lateinit var forecastPresenter: ForecastPresenter

    override fun onCreate(savedInstanceState: Bundle?) {
        AndroidInjection.inject(this)
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_home)
    }

    override fun onRetry() {
       /* do something here */
    }
}

Мой ActivityBuilder имеет следующий вид:

@Module
abstract class ActivityBuilder {
    @ContributesAndroidInjector(modules = [ActivityModule::class])
    abstract fun injectIntoRetryFragment(): RetryFragment
}

Мой компонент такой:

@Singleton
@Component(modules = [
    AndroidSupportInjectionModule::class,
    ActivityBuilder::class,
    ActivityModule::class])
interface StockComponent {
    @Component.Builder
    interface Builder {
        @BindsInstance
        fun application(application: StockApplication): Builder

        fun build(): StockComponent
    }

    fun inject(application: StockApplication)
}

И мое приложение:

class StockApplication : Application(), HasActivityInjector, HasSupportFragmentInjector {

    @Inject
    lateinit var dispatchingAndroidActivityInjector: DispatchingAndroidInjector<Activity>

    @Inject
    lateinit var dispatchingAndroidFragmentInjector: DispatchingAndroidInjector<Fragment>

    override fun onCreate() {
        super.onCreate()

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

    override fun activityInjector(): AndroidInjector<Activity> {
        return dispatchingAndroidActivityInjector
    }

    override fun supportFragmentInjector(): AndroidInjector<Fragment> {
        return dispatchingAndroidFragmentInjector
    }
}

Так что вопрос при использовании dagger-android, как я могу ввести RetryListener вRetryFragment, что RetryListener реализовано ForecastActivity?

Заранее большое спасибо

1 Ответ

1 голос
/ 20 апреля 2019

Я не вижу модуль, который обеспечивает ваш ForecastActivity, то есть:

@ContributesAndroidInjector
abstract fun forecastActivity(): ForecastActivity

Activity потребуется реализовать HasSupportFragmentInjector и предоставить DispatchingAndroidInjector<Fragment>

...