2

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

示例仅显示了在活动内部使用 Kodein 时很热,但在其他部分上没有

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

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

4

5 回答 5

1

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()
}
于 2019-01-07T13:47:02.770 回答
1

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

override val kodein by closestKodein(context)

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

于 2019-11-14T14:29:09.737 回答
1

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

val dataLayer: DataLayer = appKodein().instance()
于 2020-01-10T16:19:30.103 回答
0
class ReportViewModel(context: Context):ViewModel() ,KodeinAware
{
override val kodein by kodein(context)
val reportRepository:ReportRepository by instance()
}

我的答案

于 2021-09-27T08:26:24.800 回答
0

override val kodein by kodein(activity!!)

于 2020-04-22T06:44:25.683 回答