Внедрение зависимостей Android для диспетчера работAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Внедрение зависимостей Android для диспетчера работ

Сообщение Anonymous »

Я пытаюсь использовать Workers для отправки данных и изображений в фоновом режиме, для этого моему Worker нужен доступ к нескольким различным репозиториям.
Когда я начал свой проект, я следуя тому, что я узнал на курсе Developer.android, поэтому я использовал внедрение зависимостей вручную.
У меня есть AppContainer, который связывает OfflineRepository с репозиторием.
AppContainer.kt

Код: Выделить всё

/** Dependency Injection container at the application level */
interface AppContainer {
val vistoriaRepository: VistoriaRepository
val ativosRepository: AtivosRepository
}

class DefaultAppContainer(private val context: Context) : AppContainer {
private val baseUrl = "$dominio/"

private val json = Json { ignoreUnknownKeys = true }

private val retrofit: Retrofit = Retrofit.Builder()
.addConverterFactory(json.asConverterFactory("application/json".toMediaType()))
.baseUrl(baseUrl)
.build()

/** Retrofit service object for creating api calls */
private val retrofitService: AWFApiService by lazy {
retrofit.create(AWFApiService::class.java)
}

/** Dependency Injection - implementação pro VistoriaRepository */
override val vistoriaRepository: VistoriaRepository by lazy {
NetworkVistoriaRepository(retrofitService)
}

override val ativosRepository: AtivosRepository by lazy {
OfflineAtivosRepository(VistoriaDatabase.getDatabase(context).ativoDao())
}
}
И AppViewModelProvider
AppViewModelProvider.kt

Код: Выделить всё

object AppViewModelProvider {
val Factory = viewModelFactory {

initializer {
val application = (this[APPLICATION_KEY] as VistoriaApplication)
val vistoriaRepository = application.container.vistoriaRepository
VistoriaViewModel(
vistoriaRepository = vistoriaRepository,
)
}

initializer {
AtivosViewModel(
this.createSavedStateHandle(),
vistoriaApplication().container.ativosRepository,
vistoriaApplication().container.imagensRepository,
vistoriaApplication().container.caracteristicasDoAtivoRepository,
vistoriaApplication().container.subitensRepository,
vistoriaApplication().container.imagensDosSubitensRepository
)
}
}
}

//Extension function to queries for [Application] object and returns an instance of [VistoriaApplication].
fun CreationExtras.vistoriaApplication(): VistoriaApplication =
(this[APPLICATION_KEY] as VistoriaApplication)
Проблема в том, что весь контент, который я нашел в DI for Worker Manager, использует Hilt. Поэтому я не уверен, что проблемы, с которыми я столкнулся, связаны с тем, что у меня есть два способа выполнения внедрения внедрения.
Для руководителя работы я выполнил внедрение внедрения следующим образом.Мой работник

Код: Выделить всё

@HiltWorker
class EnviarImagensWorker @AssistedInject constructor (
@Assisted private val context: Context,
@Assisted private val workerParams: WorkerParameters,
private val vistoriaRepository: VistoriaRepository,
private val ativosRepository: AtivosRepository,
private val imagensRepository: ImagensRepository,
private val imagensDosSubitensRepository: ImagensDosSubitensRepository
): CoroutineWorker(context, workerParams){

override suspend fun doWork(): Result {
//He does stuff that ne
}
}
Модуль данных

Код: Выделить всё

@InstallIn(SingletonComponent::class)
@Module
object DataModule {

@Singleton
@Provides
fun provideVistoriaRepository(vistoriaRepository: NetworkVistoriaRepository): VistoriaRepository {
return vistoriaRepository
}

@Singleton
@Provides
fun provideAtivosRepository(ativosRepository: OfflineAtivosRepository): AtivosRepository {
return ativosRepository
}

@Singleton
@Provides
fun provideImagensRepository(imagensRepository: OfflineImagensRepository): ImagensRepository {
return imagensRepository
}

@Singleton
@Provides
fun provideImagensDosSubitensRepository(imagensDosSubitensRepository: OfflineImagensDosSubitensRepository): ImagensDosSubitensRepository {
return imagensDosSubitensRepository
}
}
Мое приложение

Код: Выделить всё

@HiltAndroidApp
class VistoriaApplication : Application(), Configuration.Provider {
/** AppContainer instance used by the rest of classes to obtain dependencies */
lateinit var container: AppContainer
override fun onCreate() {
super.onCreate()
container = DefaultAppContainer(this)
}

@Inject
lateinit var customWorkerFactory: CustomWorkerFactory

override val workManagerConfiguration =
Configuration.Builder()
.setMinimumLoggingLevel(Log.DEBUG)
.setWorkerFactory(customWorkerFactory)
.build()

}

class CustomWorkerFactory @Inject constructor(
private val vistoriaRepository: VistoriaRepository,
private val ativosRepository: AtivosRepository,
private val imagensRepository: ImagensRepository,
private val imagensDosSubitensRepository: OfflineImagensDosSubitensRepository
): WorkerFactory(){
override fun createWorker(
appContext: Context,
workerClassName: String,
workerParameters: WorkerParameters
): ListenableWorker = EnviarImagensWorker(appContext, workerParameters, vistoriaRepository, ativosRepository, imagensRepository, imagensDosSubitensRepository)
}
И один из моих репозиториев

Код: Выделить всё

class OfflineAtivosRepository @Inject constructor (private val ativoDao: AtivoDao) : AtivosRepository {
override fun getAllAtivosStream(): Flow = ativoDao.getAllAtivos()

override fun getAtivoStream(id: Long): Flow = ativoDao.getAtivo(id)

}
И ошибка, которую я получаю при попытке запустить приложение.
Ошибка очень большая, и я не нашел способа чтобы скопировать и вставить сюда текст.
изображение ошибки

Подробнее здесь: https://stackoverflow.com/questions/791 ... rk-manager
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»