翻转屏幕时,我在重新创建活动时遇到问题。Dagger 2 每次都会为演示者提供一个新链接,我需要它来保存或至少在第一次启动后使用之前创建的指向演示者的链接。
我需要这个来保存、恢复 RecyclerView 状态。
现在我保存了,不是很方便。
class ArticlesActivity : AppCompatActivity(), ViewArticles {
@Inject lateinit var presenter: PresenterImpl
private lateinit var viewAdapter: RecyclerView.Adapter<RecyclerView.ViewHolder>
private lateinit var viewManager: RecyclerView.LayoutManager
private lateinit var search : EditText
private lateinit var recyclerView: RecyclerView
private lateinit var progressBar : ProgressBar
override fun onCreate(savedInstanceState: Bundle?) {
AndroidInjection.inject(this)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_articles)
if(presenterImpl == null) {
presenterImpl = presenter // 1 кэширую ссылку
presenterImpl!!.getData(0, "")
}else{
presenterImpl!!.onConfigurationChanged(this)
}
//...
}
companion object {
private val TAG = "ArticlesActivity"
private var presenterImpl: PresenterImpl? = null //2. СЮДА
}
}
这里需要将接收到的链接缓存在companion中,翻屏后查看。有用。但在这里我保留了两个到 Presenter 的链接。
之前通过为每个activity声明一个单独的Scope解决了这个问题,并且从2.11开始有一个ActivityInjector,它知道可以重新创建Activity。例如阅读此文本https://proandroiddev.com/how-to-android-dagger-2-10-2-11-butterknife-mvp-part-1-eb0f6b970fd
上面给我的那篇文章适合已经对dagger很熟悉的人,我不是很好,而且例子都是用java给出的,但是在文章中我找到了kotlin的链接。这篇文章的主要缺点是依赖很多,很难把所有的东西放在一起。进一步搜索,我在网上找到了一位读者对这篇文章的推荐,这里作者描述了匕首 2. 2.15,非常简短,但清晰。链接到github。
我也想分享一个非常小的来源,当然它不完整,或者更确切地说,续订是有偿的,但它为理解提供了一个良好的开端。
现在我将告诉你我是如何解决我的问题的。(也许这不是实现的最终版本,或者你可以做不同的更好的。这取决于你)为了更好地理解我的代码的含义,请阅读文章。
作者写道,如果我们将其
MainActivityModule.kt设为静态,我们将收到旧实例(如果我理解正确。正确)不幸的是,这不起作用,每次我翻转手机时,我都会获得一个指向演示者的新链接。但是作者有一个方法是保存并返回一个可缓存的链接,这个函数的实现放在
AppModule. 这里主要是指定@Singleton,否则不会缓存。Presenter应该有对MainActivity中定义的接口的引用,但是你可以看到我没有把它作为presenterImpl参数传递。我想了很长时间如何做到这一点,经历了很多选择,结果我收到了两个不同的链接。
解决方案
在 dagger 初始化对presenterImpl的引用之后,我们必须手动传递引用。解决方案取自下面的 repo。
MainActivity.kt
于 2018 年 6 月 9 日编辑
这是另一个描述 dagger 2. 2.15 kotlin 的repo。
如果我帮助了你,请按向上箭头。