如何在Kodein的活动或碎片之外注入依赖性?

时间:2019-01-03 16:10:45

标签: android kodein

想使用Kodein DI Android在非活动或片段类中初始化接口

示例仅显示在活动中使用Kodein的热门,而在其他部分则没有

 class MainViewModel() :  KodeinAware{
   override val kodein by closestKodein()
   val repository : Repository by instance()
 }

在活动中它起作用,但在其他类中则显示错误。 我想在另一个类中初始化接口

5 个答案:

答案 0 :(得分:1)

closestKodein仅适用于Android Context感知类(例如片段和活动)。 要在这些类之外使用它,您需要一个Android context

android文档明确指出:

  

警告:ViewModel绝不能引用视图,生命周期或任何可能包含对活动上下文的引用的类。

     

[...]

     

如果ViewModel需要Application上下文(例如,查找系统服务),则可以扩展AndroidViewModel类,并具有一个构造函数,该构造函数在构造函数中接收Application,因为Application类扩展了Context。

因此,要从ViewModel访问Kodein:

class MainViewModel(app: Application) : ApplicationViewModel(app), KodeinAware {
    override val kodein = app.kodein
    val repository : Repository by instance()
}

答案 1 :(得分:1)

在任何地方使用它。 appKodein是全局函数。

val dataLayer: DataLayer = appKodein().instance()

答案 2 :(得分:0)

答案 3 :(得分:0)

Simpy将上下文或活动作为参数传递

override val kodein by closestKodein(context)

更多信息https://kodein.org/Kodein-DI/?5.0/android#_getting_a_kodein_object

答案 4 :(得分:0)

override val kodein by kodein(activity!!)