РЕДАКТИРОВАТЬ
Решила проблему. См. Мой пост ниже.
Я пишу приложение для Android с использованием кинжала и котлина.
Я хочу ввести класс java.text.SimpleDateFormat
в свой класс DateHelper
@Singleton class DateHelper @Inject constructor(var dateFormat: SimpleDateFormat) { ... }
У меня есть модуль, который @Provides
SimpleDateFormat
.
@Module class DateModule { @Singleton @Provides fun dateFormat(): SimpleDateFormat { return SimpleDateFormat("yyyy-MM-dd", Locale.US) } }
и компонент кинжала:
@Singleton @Component(modules = arrayOf(MyAppModule::class, DateModule::class)) interface MyAppComponent { ... }
Наконец, мое Application
:
open class MyApplication : Application() { private lateinit var myAppComponent: MyAppComponent override fun onCreate() { super.onCreate() myAppComponent = createGraph() } open fun createGraph(): MyAppComponent { return DaggerMyAppComponent.builder().myAppModule(MyAppModule(this)).build() } fun getAppComponent(): MyAppComponent { return myAppComponent } }
Теперь я пытаюсь @Inject
DateHelper
в свой Fragment
:
class CoffeeNoteFragment : Fragment(), DatePickerDialog.OnDateSetListener { @Inject lateinit var dateHelper: DateHelper ... override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) (activity.application as MyApplication).getAppComponent().inject(this) } }
К сожалению, я получаю ошибку времени компиляции
error: [com.example.mateusz.coffeenotes.application.MyAppComponent.inject(com.example.mateusz.coffeenotes.CoffeeNoteFragment)] java.text.SimpleDateFormat cannot be provided without an @Inject constructor or from an @Provides-annotated method. java.text.SimpleDateFormat is injected at com.example.mateusz.coffeenotes.database.DateHelper.<init>(arg0) com.example.mateusz.coffeenotes.database.DateHelper is injected at com.example.mateusz.coffeenotes.CoffeeNoteFragment.dateHelper com.example.mateusz.coffeenotes.CoffeeNoteFragment is injected at com.example.mateusz.coffeenotes.application.MyAppComponent.inject(arg0)
Я не понимаю, почему я получаю эту ошибку, так как я @Providing
SimpleDateFormat
. Очевидно, я не могу добавить конструктор @Inject
, так как у меня нет класса SimpleDateFormat
.
Любая помощь в том, что мне не хватает?
Решила проблему
Я не понимал, что проблема возникла из другого компонента, который я использую для тестирования.
У меня есть TestComponent
в src/debug/java/...
, который предоставляет макетные реализации для моих тестов:
@Singleton @Component(modules = arrayOf(TestModule::class)) interface TestComponent : MyAppComponent
Поскольку этот компонент расширяет MyAppComponent
, я также должен предоставить привязки к нему. Очевидно, что здесь отсутствует DateModule
. Изменение ниже фиксирует ошибку компиляции :
@Singleton @Component(modules = arrayOf(TestModule::class, DateModule::class)) interface TestComponent : MyAppComponent
Я был введен в заблуждение сообщением об ошибке компиляции, в котором указано, что MyAppComponent
отсутствует привязка, тогда как фактическая проблема лежит в TestComponent
.
Является ли мое рассуждение правильным, что фактическое сообщение об ошибке должно относиться к TestComponent
?