kotlin - Koin:为什么在 myObject.scope.close() 之后,它仍然有效?
问题描述
我有一个范围
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.
同样,如果我这样做,它也会崩溃
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
还能提供presenter?(和同一个主持人)
val presenter = myObject.scope.get<Presenter>(Presenter::class.java)
myObject.scope.close()
val presenter2 = myObject.scope.get<Presenter>(Presenter::class.java)
// presenter1 == presenter2
解决方案
显然,myObject.scope
实际上是myObject.getOrCreateScope()
。因此,即使在myObject.scope.close()
被调用之后,myObject.scope
它仍然会工作,因为它会再次创建一个新的范围。
但是如果我们执行以下操作(关闭它),无论使用myScope
or myObject.scope
,它仍然会关闭,因此再次使用它myScope
会崩溃。
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
推荐阅读
- pytorch - 在 pytorch 强化学习中更改输入类型的问题
- linux - 如何独立于扬声器控制键盘上的静音 LED
- ios - 如何使用 iOS 共享扩展将 pdf 文件从电子邮件/iOS 设备共享到 iOS 应用程序?
- logic - Logic Audio:如何从延音踏板数据创建一个锁定拨动开关
- javascript - 如何从浏览器打开机器上的 Outlook 客户端以添加日历事件?
- database - spatialite coverter.exe updateTableTriggers() 错误
- r - 在 r 中的特定字符之后删除变量中的所有字符
- ldap - Alfresco LDAP 批量同步
- rust - Rocket - 在我的守卫中使用状态失败,因为未实现特征
- c# - Xamarin Forms - iOS 上的轮播问题