Возможно ли, чтобы родительское и дочернее представления ссылались друг на друга путем инъекции / поиска до завершения Init? - PullRequest
0 голосов
/ 01 октября 2019

Я хочу, чтобы встроенное представление могло вызывать функцию из родительского представления, поэтому я пытаюсь, чтобы дочерний элемент ссылался на своего родителя путем инъекции. Кажется, это работает нормально, если встроенный вид создается в Dock:

class TestView : View() {
    override val root = vbox {
        label("Parent Label")
    }

    init {
        println("Parent is instantiating.")
    }

    override fun onDock() {
        val child = find(TestView2::class)
        root.add(child)
    }

    fun doThing() {
        println("Parent is doing a thing.")
    }
}

class TestView2 : View() {
    val parentClass: TestView by inject()

    override val root = hbox {
        label("Sub-view label 1")
        label("Sub-view label 2")
    }

    init {
        println("Sub-view is instantiating.")
        parentClass.doThing()
    }
}

Хотя я бы хотел, чтобы он был чище. Я бы предпочел, если бы я мог использовать функцию поиска при создании родительского корня. Это проблема, поскольку вызов дочернего представления в любой части процесса init создает циклический цикл создания экземпляров. Любой способ избежать этого, или мне просто придется согласиться на onDock и разобраться с этим?

РЕДАКТИРОВАТЬ:

Просто чтобы заметить, я снова попробовал метод onDock вреальное, более сложное приложение, и я получил ошибку обнаружения цикла. Так что даже этот метод не гарантированно работает.

1 Ответ

1 голос
/ 02 октября 2019

Вы можете создавать циклические зависимости, но не можете вызывать функции в блоке инициализации обоих компонентов, так как это было бы невозможно разрешить. Главное здесь - то, что вы, вероятно, делаете то, что не должны делать. Представления не должны общаться друг с другом напрямую. Это создает жесткую связь и предотвращает повторное использование. Вместо этого вам следует общаться с одним из следующих:

  1. Состояние из ViewModel
  2. Вызов функции контроллера
  3. События с использованием EventBus

Поскольку ваш пример кода составлен, неизвестно, чего именно вы пытаетесь достичь в вашем реальном приложении, но вы найдете правильный подход в приведенном выше списке.

Я вижу необходимость вызывать функциив представлениях и настройке данных непосредственно в компоненты пользовательского интерфейса, вместо того, чтобы часто использовать привязки, и в любом случае есть гораздо лучший способ решения проблемы:)

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