Предоставить сторонний экземпляр класса с помощью Hilt

#android #kotlin #dagger-hilt

#Android #kotlin #dagger-рукоять

Вопрос:

Я использую Googles mlkit для сканирования штрих-кодов. Я включил некоторые из их примеров файлов. Я хотел бы внедрить BarcodeScannerProcessor ниже, используя Hilt, вместо создания встроенного экземпляра.

Я попытался пометить его как @ActivityScoped и ввести @ActivityContext context: Context в его конструктор, который, насколько я знаю, должен быть эквивалентен встроенному экземпляру ниже. Однако, когда я делаю это и добавляю его в действие ниже, я просто получаю черное окно сканера. Как я могу предоставить BarcodeScannerProcessor с помощью Hilt?

 class ScannerActivity : AppCompatActivity(){
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    setContentView(R.layout.activity_vision_live_preview)
    
    // some rows omitted for brevity
    val processor = BarcodeScannerProcessor(this)
    cameraSource!!.setMachineLearningFrameProcessor(processor)
  }
}
  

Моя попытка изменить BarcodeScannerProcessor:

 @ActivityScoped
class BarcodeScannerProcessor @Inject constructor(@ActivityContext context: Context) 
                                         : VisionProcessorBase<List<Barcode>>(context) {
//....
  

Вводится в ScannerActivity с помощью:

 @Inject lateinit var barcodeScannerProcessor: BarcodeScannerProcessor
  

Комментарии:

1. Не могли бы вы предоставить класс с модулем @Provides ? Или я неправильно понимаю вопрос? Кроме того, не могли бы вы добавить свой подход?

2. @Andrew Вы имеете в виду перенос создания в другой модуль, который предоставляет экземпляр BarcodeScannerProcessor с использованием @Provides ? Я тоже думал об этом, но мне кажется, что это ненужный дополнительный шаг, когда у меня есть контроль над классом? Я обновил вопрос своей попыткой

3. Нет, вы все сделали правильно, но я думаю processor = BarcodeScannerProcessor(this) , что это неправильно. Вы уже внедрили свой barcodeScannerProcessor в свой activty. Просто позвоните cameraSource!!.setMachineLearningFrameProcessor(barcodeScannerProcessor)

4. @Andrew Да, я это сделал, и именно тогда я получаю черное окно сканера. Верхний фрагмент — единственный способ заставить его работать, извините, если это неясно.

5. Я думаю, это как-то связано с. @ActivityScoped Что происходит, когда вы его удаляете?