2017-07-26 1 views
0

J'ai un problème, je ne sais pas pourquoi mais ma variable n'injecte pas et est nulle. Je donne la méthode comme ceci:Fournir des méthodes dans Dagger 2

@Provides 
@Singleton 
fun provideSource(context: Context): DatabaseSource = DatabaseSource(context, Models.DEFAULT, DB_NAME, DB_VERSION) 

@Provides 
@Singleton 
fun provideStoreDB(databaseSource: DatabaseSource): KotlinReactiveEntityStore<Store> = KotlinReactiveEntityStore(KotlinEntityDataStore(databaseSource.configuration)) 

@Provides 
@Singleton 
@NotNull 
fun provideStores() : Database<Store> = PersistentDatabase(Store::class) 

et classe pour le modèle magasin:

il est héritier de la classe "persistable".

@Entity 
data class Store(val id: Long = 0, val name: String = "", val description: String = "", val date: String = "") : DisplayableItem, Persistable 

classe pour les travaux avec DB

@Singleton 
class PersistentDatabase <T: Any> (val type: KClass<T>) : Database <T> { 
    @Inject 
    internal lateinit var store: KotlinReactiveEntityStore<T> 

    override fun addResult(item: T): Completable = store.insert(item).toCompletable() 

    override fun addListResult(item: List<T>): Completable = store.insert(item).toCompletable() 

    override fun deleteResult(item: T): Completable = store.delete(item) 

    override fun getAllResults(): Single<List<T>> = (store select type).get().observable().toList() 

    override fun removeAllResults(): Completable = store.delete(type).get().single().toCompletable() 
} 

Dans ma couche dépôt-je l'utiliser comme ceci:

@Inject 
lateinit var database: Database<DetectedLanguageText> 

fun getHistory(): Single<List<DetectedLanguageText>> { 
    return database.getAllResults() 
      .map { it.sortedByDescending { it.date } } 
      .transitSuccessToEmitter(historyEmitter) 
} 

Mais quand je suis en fonction getAllResults la variable

@Inject 
    internal lateinit var store: KotlinReactiveEntityStore<T> 

N'injecte pas et est égal à null. Pourquoi ça ne marche pas pour moi?

Répondre

1

Je ne vois pas où vous injectez KotlinReactiveEntityStore dans PersistentDatabase. Vous venez de créer une instance dans la méthode provides, mais aucune injection n'est effectuée.

+0

ici: (chien) Injecter lateinit interne magasin var: KotlinReactiveEntityStore

+1

Oui, champ marqué comme injectable, mais vous créez une instance manuellement, ne pas vous? Donc, c'est à vous de définir ce champ. Dagger injectera un champ s'il crée une instance. – Guliash

+1

Si vous annotez des champs avec '@ Inject', vous devez appeler' component.inject (myObject) 'pour injecter ses champs. Vous n'avez inclus aucun code qui vous suggère de le faire. –