подожди пока латинит назначен - PullRequest
0 голосов
/ 07 октября 2019

У меня есть простой класс, который я использую для внедрения зависимостей:

class ViewModelFactory( application: Application ) : ViewModelProvider.Factory
{

    val mainFlow                  = MainFlow()
    private val authorizationFlow = AuthorizationFlow()

    init
    {
        mainFlow.authFlow = authorizationFlow
    }

    ..
}

Основной класс потока:

class MainFlow
{
    lateinit var authFlow : AuthorizationFlow

    init
    {
        if( ::authFlow.isInitialized )
            authFlow.start()
    }
}

И поток авторизации

class AuthorizationFlow
{
    fun start()
    {
        // do some stuff
    }
}

Очевидная проблема заключается в том, что свойство authFlow в классе MainFlow никогда не инициализируется при выполнении init . Как я могу «дождаться» инициализации authFlow и только потом вызывать метод authFlow.start ()? Спасибо!

Ответы [ 2 ]

2 голосов
/ 07 октября 2019

Вы можете сделать инъекцию члена вместо того, чтобы сделать его латинитом

class MainFlow {
    var authFlow : AuthorizationFlow? = null
        set(value) {
            field = value
            value?.start()
        }
}

Недостатком является то, что вы имеете дело с типом, допускающим обнуляемость.

2 голосов
/ 07 октября 2019

Вы можете использовать Delegates.observable:

var authFlow: AuthorizationFlow? by Delegates.observable<AuthorizationFlow?>(null) { _, old, new -> {
    if (old == null && new != null) {
        new.start()
    }
}

и удалить свой блок init.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...