想使用Kodein DI Android在非活动或片段类中初始化接口
示例仅显示在活动中使用Kodein的热门,而在其他部分则没有
class MainViewModel() : KodeinAware{
override val kodein by closestKodein()
val repository : Repository by instance()
}
在活动中它起作用,但在其他类中则显示错误。 我想在另一个类中初始化接口
答案 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!!)