Je ne peux pas créer le constructeur secondaire pour cette classe abstraite.
@SuppressLint("StaticFieldLeak")
abstract class BaseAndroidViewModel(
application: Application,
private val creditsGetByIdUseCase: CreditsGetByIdUseCase,
private val videosGetByIdUseCase: VideosGetByIdUseCase,
private val reviewGetByIdUseCase: ReviewGetByIdUseCase,
private val addToFavoritesUseCase: AddToFavoritesUseCase,
private val getFavoriteByIdUseCase: GetFavoriteByIdUseCase
) : AndroidViewModel(application) {
constructor(application: Application) : this(application) // There's a cycle in the delegation calls chain error
3 Réponses :
Lorsque vous créez un constructeur secondaire et qu'une classe a un constructeur primaire non vide, vous devez transmettre tous les paramètres du constructeur primaire , par exemple:
abstract class BaseAndroidViewModel(
application: Application,
private val creditsGetByIdUseCase: CreditsGetByIdUseCase? = null,
private val videosGetByIdUseCase: VideosGetByIdUseCase? = null,
private val reviewGetByIdUseCase: ReviewGetByIdUseCase? = null ,
private val addToFavoritesUseCase: AddToFavoritesUseCase? = null,
private val getFavoriteByIdUseCase: GetFavoriteByIdUseCase? = null
) : AndroidViewModel(application) { ... }
Dans votre cas, cela peut être le suivant:
@SuppressLint("StaticFieldLeak")
abstract class BaseAndroidViewModel(
application: Application,
private val creditsGetByIdUseCase: CreditsGetByIdUseCase?,
private val videosGetByIdUseCase: VideosGetByIdUseCase?,
private val reviewGetByIdUseCase: ReviewGetByIdUseCase?,
private val addToFavoritesUseCase: AddToFavoritesUseCase?,
private val getFavoriteByIdUseCase: GetFavoriteByIdUseCase?
) : AndroidViewModel(application) {
constructor(application: Application) : this(application, null, null, null, null, null)
}
Ou vous pouvez créer un constructeur principal avec les paramètres par défaut:
abstract class BaseAndroidViewModel(
application: Application,
private val creditsGetByIdUseCase: String,
private val videosGetByIdUseCase: String
) : AndroidViewModel(application) {
constructor(application: Application) : this(application,
"creditsGetByIdUseCase", "videosGetByIdUseCase") // here we pass other necessary parameters
}
Vous pouvez appeler le constructeur secondaire comme ceci -
@SuppressLint("StaticFieldLeak") abstract class BaseAndroidViewModel : AndroidViewModel{
constructor(application: Application,
creditsGetByIdUseCase: CreditsGetByIdUseCase,
videosGetByIdUseCase: VideosGetByIdUseCase,
reviewGetByIdUseCase: ReviewGetByIdUseCase,
addToFavoritesUseCase: AddToFavoritesUseCase,
getFavoriteByIdUseCase: GetFavoriteByIdUseCase) : super(application)
constructor(application: Application) : super(application) }
La raison pour laquelle vous obtenez un cycle dans l'erreur de chaîne d'appels de délégation , est que
BaseAndroidViewModel(application: Application): AndroidViewModel(application)
Est l'équivalent de java:
constructor(application: Application): super(application)
Ceci dit que vous appelez votre constructeur de manière récursive.
Comme indiqué dans Réponse d'Alok Mishra , vous devriez plutôt appeler le super constructeur.
public MyClass(Application application){
this(application)
}
C'est en fait l'équivalent de votre constructeur principal:
constructor(application: Application): this(application)
Vous pouvez constater qu'il ne s'agit que d'un remplacement des mots clés constructor par BaseAndroidViewModel et super par AndroidViewModel