想用 Kodein DI Android 在非活动或片段类中初始化接口
示例仅显示了在活动内部使用 Kodein 时很热,但在其他部分上没有
class MainViewModel() : KodeinAware{
override val kodein by closestKodein()
val repository : Repository by instance()
}
在活动中它可以工作,但在其他类中它显示错误。我想在另一个类中初始化接口
closestKodein
仅适用于 AndroidContext
感知类(例如片段和活动)。要在这些类之外使用它,您需要一个 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()
}
Simpy 将上下文或活动作为参数传递
override val kodein by closestKodein(context)
更多信息https://kodein.org/Kodein-DI/?5.0/android#_getting_a_kodein_object
在任何地方使用它。appKodein
是全局函数。
val dataLayer: DataLayer = appKodein().instance()
class ReportViewModel(context: Context):ViewModel() ,KodeinAware
{
override val kodein by kodein(context)
val reportRepository:ReportRepository by instance()
}
我的答案
override val kodein by kodein(activity!!)