上周,在我当前的 Kotlin MVP 项目中实施 Dagger 时,由于主要手机的维护,我在带有KitKat 4.4.2 的旧手机上测试它(是的,它仍然支持所有主要的材料功能和东西 :))。所以那一周我遇到了典型的问题,而不是一些不寻常的问题,并通过调查提供的错误或多或少地修复了它们。最后,代码已编译,当前项目版本的构建没有问题,并且在 KitKat 与 UI 交互时没有重大错误。
但是当我从维修中心拿起带有Nougat 7.1.2 的主手机并在其上启动应用程序时,我遇到了与 DI 相关的奇怪问题。在那之后,我还在 mate 的Marshmallow 6.0上启动了应用程序,然后又抓到了一个,一模一样。问题简要描述如下:
应用程序(成功)启动;
我能够操作通过上下文和片段管理器注入提供的 ViewPager/DrawerLayout/etc ui 功能;
所有服务也都可用并按预期通过注入运行;
当我抽动 Activity 的演示者时,应用程序崩溃。
现在最有趣的部分让我发疯:所有不会带来任何问题的可访问类都是通过构造函数注入注入的。
但是,演示实例,这是使用注射字段注入,是没有初始化需要的时候。
当然,我尝试不使用 lateinit 修饰符,而是像使用 @JvmField 或不使用它的可空字段一样注入它:结果是相同的 - 它根本没有注入。
由于问题与 相关Activity,我有“自然约束”不使用主构造函数进行注入。
这是一个例外,除了第一个字符串外,它对我来说信息量不大:
kotlin.UninitializedPropertyAccessException: lateinit property presenter has not been initialized
at .ui.common.view.BaseViewActivity.getPresenter(BaseViewActivity.kt:14)
at .ui.main.view.MainActivity.onPlaceTypeClick(MainActivity.kt:143)
at .ui.types.nearby.view.NearbyPlaceTypeItemViewHolder$bind$1.onClick(NearbyPlaceTypeItemViewHolder.kt:32)
at android.view.View.performClick(View.java:5647)
at android.view.View$PerformClick.run(View.java:22462)
at android.os.Handler.handleCallback(Handler.java:754)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:163)
at android.app.ActivityThread.main(ActivityThread.java:6205)
at java.lang.reflect.Method.invoke(Native Method) …Run Code Online (Sandbox Code Playgroud)