2017-07-03 17 views
17

Z ostatnimi wersjami sztyletu 2 jedną z wprowadzonych poprawek jest możliwość posiadania metod statycznego dostarczania. Po prostu:Sztylet 2 statyczne metody dostawców w kotlinie

@Provides 
static A providesA() { 
    return A(); 
} 

Zastanawiam się, jak można to zrobić w kotlinach? Próbowałem

@Module 
class AModule { 
    companion object { 
    @JvmStatic 
    @Provides 
    fun providesA(): A = A() 
    } 
} 

Ale pojawia się komunikat o błędzie:

@Provides methods can only be present within a @Module or @ProducerModule 

Zgaduję, że coś się tutaj dzieje z obiektem towarzysza, jednak jestem całkiem nowy w Kotlin i ja” Nie wiem, jak to zrobić. Czy to możliwe?

Dzięki!

+0

Dyskusja na ten temat jest również dostępna na https://www.reddit.com/r/androiddev/comments/75rc85/keeping_the_daggers_sharp_square_corner_blog/do8ktb3/ jest trzecia opcja - funkcje najwyższego poziomu . – arekolek

Odpowiedz

10

nie mogę przetestować go teraz, ale myślę, że to powinno działać:

@Module 
object AModule { 
    @JvmStatic 
    @Provides 
    fun providesA(): A = A() 
} 
+0

dzięki! to wydaje się działać. – Fred

+0

@Fred, czy możesz zaakceptować tę odpowiedź, jeśli rozwiąże ona Twój problem? –

+0

Przepraszam, całkowicie zapomniałem o tym – Fred

18

Chociaż myślę zsmb13 „s rozwiązanie jest lepsze, znalazłem inne rozwiązanie, które działa

@Module 
class AModule { 
    @Module 
    companion object { 
    @JvmStatic 
    @Provides 
    fun providesA(): A = A() 
    } 

    // add other non-static provides here 
} 

Należy jednak zauważyć, że będą dwie wygenerowane klasy: AModule_ProvidesAFactory i AModule_Companion_ProvidesAFactory zamiast jednej klasy AModule_ProvidesAFactory dla przypadku o bject zamiast klasy z towarzyszem obiektu

+0

W rzeczywistości rozwiązanie @ zsmb13 nie działało dla mnie, tak samo jak Ty. –

+0

Cieszę się, że to pomogło: D –

+2

To też jest miłe, ponieważ AModuł może być abstrakcyjny – vlazzle