diff --git a/README.md b/README.md index 4d77164a..7dc61c45 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,20 @@ ### Реализуйте ApplicationComponent -Это корень нашего дерева компонентов. Инициализируется в классе App, прокидывает в граф через Component Dependencies/Subcomponents ниже по графу следующие сущности: +Это корень нашего дерева компонентов. Инициализируется в классе App, прокидывает +в граф через Component Dependencies/Subcomponents ниже по графу следующие сущности: - Context(Application) до FragmentProducerComponent и FragmentReceiverComponent. Проброс Context в граф реализуйте через BindsInstance + ComponentFactory ### Реализуйте MainActivityComponent Инициализируется в MainActivity. Прокидывает следующие сущности: - Context(Activity). Проброс в граф реализуйте через BindsInstance + ComponentFactory -- Ваша реализация обсервера(Coroutine Channel/StateFlow/Subject либо другую реализацию обсервера). Он понадобится нам чтобы отправлять евенты из одного фрагмента и принимать их в другом, в обоих фрагментах должен быть один и тот же инстанс обсервера. +- Ваша реализация обсервера(Coroutine Channel/StateFlow/Subject либо другую реализацию обсервера). + Он понадобится нам чтобы отправлять евенты из одного фрагмента и принимать их в другом, в обоих фрагментах должен быть один и тот же инстанс обсервера. ### Реализуйте FragmentReceiverComponent/FragmentProducerComponent -Коммуникацию между Producer и Receiver осуществите через канал/StateFlow/Subject либо другую реализацию обсервера которая уже есть в графе. ViewModelProducer должна отправлять эвенты, ViewModelReceiver должна получать эвенты. Обсерверы должны прокидываться в конструкторы вьюмоделей и существовать в единственном экземпляре в Activity. +Коммуникацию между Producer и Receiver осуществите через канал/StateFlow/Subject либо другую реализацию обсервера которая уже есть в графе. +ViewModelProducer должна отправлять эвенты, ViewModelReceiver должна получать эвенты. +Обсерверы должны прокидываться в конструкторы вьюмоделей и существовать в единственном экземпляре в Activity. Флоу отправки эвента выглядит следующим образом: -Клик на кнопку button в FragmentProducer -> вызов метода вьюмодели -> проброс евента в обсервер -> евент ловится на стороне ViewModelReceiver -> евент передается FragmentReceiver и вызывается функция ru.otus.daggerhomework.FragmentReceiver#populateColor +Клик на кнопку button в FragmentProducer -> вызов метода вьюмодели -> проброс евента в обсервер -> +евент ловится на стороне ViewModelReceiver -> евент передается FragmentReceiver +и вызывается функция ru.otus.daggerhomework.FragmentReceiver#populateColor \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index a5609bb9..ac3530b2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -33,12 +33,21 @@ android { } } +ext { + dagger_version = '2.38.1' +} + dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" implementation 'androidx.core:core-ktx:1.6.0' implementation 'androidx.appcompat:appcompat:1.3.1' implementation 'com.google.android.material:material:1.4.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.0' + + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.1' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0' + implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' + implementation 'com.google.dagger:dagger:2.38.1' kapt 'com.google.dagger:dagger-compiler:2.38.1' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fe328c68..e9a428ef 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" + android:name=".App" android:theme="@style/Theme.DaggerHomework"> diff --git a/app/src/main/java/ru/otus/daggerhomework/App.kt b/app/src/main/java/ru/otus/daggerhomework/App.kt index de363626..e1e3d950 100644 --- a/app/src/main/java/ru/otus/daggerhomework/App.kt +++ b/app/src/main/java/ru/otus/daggerhomework/App.kt @@ -2,5 +2,18 @@ package ru.otus.daggerhomework import android.app.Application -class App :Application() { +class App : Application() { + + private var _appComponent: ApplicationComponent? = null + + val appComponent: ApplicationComponent + get() = _appComponent ?: DaggerApplicationComponent + .factory() + .create(this) + .also { _appComponent = it } + + override fun onCreate() { + super.onCreate() + appComponent + } } \ No newline at end of file diff --git a/app/src/main/java/ru/otus/daggerhomework/ApplicationComponent.kt b/app/src/main/java/ru/otus/daggerhomework/ApplicationComponent.kt index fc47f256..cb09f883 100644 --- a/app/src/main/java/ru/otus/daggerhomework/ApplicationComponent.kt +++ b/app/src/main/java/ru/otus/daggerhomework/ApplicationComponent.kt @@ -1,4 +1,23 @@ package ru.otus.daggerhomework +import android.content.Context +import dagger.BindsInstance +import dagger.Component +import javax.inject.Qualifier +import javax.inject.Singleton + +@Qualifier +annotation class ApplicationContext + +@Singleton +@Component interface ApplicationComponent { + + @ApplicationContext + fun provideAppContext(): Context + + @Component.Factory + interface Factory { + fun create(@BindsInstance @ApplicationContext applicationContext: Context): ApplicationComponent + } } \ No newline at end of file diff --git a/app/src/main/java/ru/otus/daggerhomework/ColorGenerator.kt b/app/src/main/java/ru/otus/daggerhomework/ColorGenerator.kt index a9e25a27..9e2ff35a 100644 --- a/app/src/main/java/ru/otus/daggerhomework/ColorGenerator.kt +++ b/app/src/main/java/ru/otus/daggerhomework/ColorGenerator.kt @@ -2,8 +2,8 @@ package ru.otus.daggerhomework import android.graphics.Color import androidx.annotation.ColorInt -import androidx.annotation.ColorRes import java.util.* +import javax.inject.Inject interface ColorGenerator { @@ -11,7 +11,7 @@ interface ColorGenerator { fun generateColor(): Int } -class ColorGeneratorImpl : ColorGenerator { +class ColorGeneratorImpl @Inject constructor() : ColorGenerator { override fun generateColor(): Int { val rnd = Random() diff --git a/app/src/main/java/ru/otus/daggerhomework/FragmentProducer.kt b/app/src/main/java/ru/otus/daggerhomework/FragmentProducer.kt index 00dd10dc..ef582cb7 100644 --- a/app/src/main/java/ru/otus/daggerhomework/FragmentProducer.kt +++ b/app/src/main/java/ru/otus/daggerhomework/FragmentProducer.kt @@ -6,21 +6,37 @@ import android.view.View import android.view.ViewGroup import android.widget.Button import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider +import javax.inject.Inject class FragmentProducer : Fragment() { + @Inject + lateinit var viewModelFactory: ViewModelFactory + lateinit var viewModel: ViewModelProducer + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + DaggerFragmentProducerComponent.builder() + .mainActivityComponent((requireActivity() as MainActivity).activityComponent) + .build() + .inject(this) + viewModel = ViewModelProvider(this, viewModelFactory)[ViewModelProducer::class.java] + } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - return inflater.inflate(R.layout.fragment_a, container, true) + return inflater.inflate(R.layout.fragment_a, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) view.findViewById