Koin: Почему после myObject.scope.close () он все еще работает? - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть область действия

scope<MyObject> {
    scoped { Presenter() }
}

Затем, когда я получаю докладчика, это работает.

val presenter = myObject.scope.get<Presenter>(Presenter::class.java)

Аналогичным образом, когда я могу назначить переменную области действия, затем получить докладчика.

val myScope = myObject.scope
val presenter = myScope.get<Presenter>(Presenter::class.java)

Если мы закроем его, это все в порядке

val presenter = myObject.scope.get<Presenter>(Presenter::class.java)
myObject.scope.close()
val presenter2 = myObject.scope.get<Presenter>(Presenter::class.java)

Однако, если я назначу другую переменную области действия и закрою ее, произойдет сбой.

val myScope = myObject.scope
val presenter = myScope.get<Presenter>(Presenter::class.java)
myScope.close()
val presenter2 = myScope.get<Presenter>(Presenter::class.java) // Crash here.

Точно так же, если я сделаю это, он тоже будет sh

val myScope = myObject.scope
val presenter = myScope.get<Presenter>(Presenter::class.java)
myScope.close()
myScope.getOrCreateScope() // Crash here
val presenter2 = myScope.get<Presenter>(Presenter::class.java)

Я понимаю, что после close() область больше не сможет предоставить presenter. Я просто не понимаю, почему после myObject.scope.close(), myObject.scope все еще может предоставить докладчик? (и тот же ведущий)

val presenter = myObject.scope.get<Presenter>(Presenter::class.java)
myObject.scope.close()
val presenter2 = myObject.scope.get<Presenter>(Presenter::class.java) 
// presenter1 == presenter2

1 Ответ

0 голосов
/ 23 апреля 2020

Очевидно, myObject.scope на самом деле myObject.getOrCreateScope(). Следовательно, даже после вызова myObject.scope.close(), myObject.scope все равно будет работать, поскольку оно снова создаст новую область.

Но если мы сделаем следующее (закрываем его), независимо от использования myScope или myObject.scope, он все равно закроется, и, следовательно, используйте его снова из myScope cra cra sh.

val myScope = myObject.scope
val presenter = myScope.get<Presenter>(Presenter::class.java)
myObject.scope.close() // or myScope.scope
val presenter2 = myScope.get<Presenter>(Presenter::class.java) // this will crash

Обратитесь к обсуждению ниже и найдите https://github.com/InsertKoinIO/koin/issues/786

...