RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 836665
Accepted
Segrei Ulanov
Segrei Ulanov
Asked:2020-06-02 18:52:46 +0000 UTC2020-06-02 18:52:46 +0000 UTC 2020-06-02 18:52:46 +0000 UTC

重新创建活动时如何告诉匕首2返回上一个链接

  • 772

翻转屏幕时,我在重新创建活动时遇到问题。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 的链接。

android
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Serge Markov
    2020-06-03T00:11:47Z2020-06-03T00:11:47Z

    之前通过为每个activity声明一个单独的Scope解决了这个问题,并且从2.11开始有一个ActivityInjector,它知道可以重新创建Activity。例如阅读此文本https://proandroiddev.com/how-to-android-dagger-2-10-2-11-butterknife-mvp-part-1-eb0f6b970fd

    • 0
  2. Best Answer
    Segrei Ulanov
    2020-06-07T18:48:38Z2020-06-07T18:48:38Z

    上面给我的那篇文章适合已经对dagger很熟悉的人,我不是很好,而且例子都是用java给出的,但是在文章中我找到了kotlin的链接。这篇文章的主要缺点是依赖很多,很难把所有的东西放在一起。进一步搜索,我在网上找到了一位读者对这篇文章的推荐,这里作者描述了匕首 2. 2.15,非常简短,但清晰。链接到github。

    我也想分享一个非常小的来源,当然它不完整,或者更确切地说,续订是有偿的,但它为理解提供了一个良好的开端。

    现在我将告诉你我是如何解决我的问题的。(也许这不是实现的最终版本,或者你可以做不同的更好的。这取决于你)为了更好地理解我的代码的含义,请阅读文章。

    class PresenterImpl(){
        private var text : String = ""
    
        fun setTestInfo(text : String){
            this.text = text
        }
    
        fun getTextInfo() : String = this.text
    }
    

    作者写道,如果我们将其MainActivityModule.kt设为静态,我们将收到旧实例(如果我理解正确。正确)

    @Module
    class MainActivityModule {
    
        @Module
        companion object {
    
            @JvmStatic
            @Provides
            fun provideABCKey(): BooleanKey {
                return BooleanKey( name = "abc ", value = true )
            }
    
            @JvmStatic
            @Provides
            fun presenter(): PresenterImpl  = PresenterImpl()
    
        }
    }
    

    不幸的是,这不起作用,每次我翻转手机时,我都会获得一个指向演示者的新链接。但是作者有一个方法是保存并返回一个可缓存的链接,这个函数的实现放在AppModule. 这里主要是指定@Singleton,否则不会缓存。

    @Module
    class AppModule {
    
        @Provides
        fun provideSharedPreference(app: Application): SharedPreferences =
                PreferenceManager.getDefaultSharedPreferences(app)
    
        @Provides
        @Singleton
        fun presenter(): PresenterImpl = PresenterImpl()
    }
    

    Presenter应该有对MainActivity中定义的接口的引用,但是你可以看到我没有把它作为presenterImpl参数传递。我想了很长时间如何做到这一点,经历了很多选择,结果我收到了两个不同的链接。

    解决方案

    在 dagger 初始化对presenterImpl的引用之后,我们必须手动传递引用。解决方案取自下面的 repo。

    MainActivity.kt

    class MainActivity : DaggerAppCompatActivity(), ViewActivity {
    
        @Inject lateinit var presenterImpl: PresenterImpl
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            //Дополнил 09.06.2018
            presenterImpl.setView(this)
    
            if( presenterImpl.getTextInfo() == ""){
                Log.e("TAG", "error link null")
                presenterImpl.setTestInfo("Hello World")
            }
    
            Log.d("TAG", presenterImpl.getTextInfo())
        }
    }
    

    于 2018 年 6 月 9 日编辑

    这是另一个描述 dagger 2. 2.15 kotlin 的repo。

    如果我帮助了你,请按向上箭头。

    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5