当前位置: 首页 > 知识库问答 >
问题:

Dagger2 Android di-lateInit属性尚未初始化

暴乐邦
2023-03-14

我正在为DI与Dagger2的项目工作。我正在MVP架构中注入presenter。由于某种原因,当我构建应用程序时,它会出现错误:“LateInit property presenter has not been initialized”。我知道这意味着没有注射,但我不明白为什么。下面是我的代码:

应用程序类

class FlowerApp : Application() {

override fun onCreate() {
    super.onCreate()
    initAppComponent()
}

private fun initAppComponent() {
    appComponent = DaggerAppComponent
        .builder()
        .appModule(AppModule(this))
        .build()
}

companion object {
    lateinit var appComponent: AppComponent
}
 }

家庭模块

@Module
class HomeModule(var homeFragment: HomeContract.View) {
    @Provides
    fun providePresenter(homeInteractor: HomeInteractor): HomePresenter {
        return HomePresenter(homeFragment, homeInteractor)
    }

    @Provides
    fun provideInteractor(): HomeInteractor {
        return HomeInteractor()
    }
}

AppComponent

 @Component(
    modules = [
        (AppModule::class),
        (NetworkModule::class),
        (HomeModule::class)
    ]
)

interface AppComponent {
    fun inject(application: FlowerApp)
    fun inject(homeFragment: HomeContract.View)
}

房屋结构

class HomeFragment : Fragment(), HomeContract.View {
    @Inject
    lateinit var presenter: HomePresenter
    private lateinit var flowerAdapter: FlowerAdapter
    private var startingPage = 1
    private var recyclerStartPos = 0

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_home, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        setAdapter()
        presenter.getFlowers(startingPage)
        setListeners()
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        FlowerApp.appComponent.inject(this)
    }

如果需要任何关于代码的其他信息,请询问...

编辑:logcat错误:

2020-06-06 22:12:37.513 134 01-13401/?E/AndroidRuntime:致命异常:主进程:Element.List.FlowerSMVP,PID:13401 Kotlin.UninitializedPropertyAccessException:在AndroidX.Fragment.App.FragmentManagerImpl.MoveToState(FragmentManagerImpl.java:892)处的Element.List.FlowerSmvp.Home.HomeFragment.OnViewCreated(HomeFragment.kt:37)处的AndroidX.Fragment.App.FragmentManagerImpl.MoveFragmentToExpectedState(A:1727)位于AndroidX.Fragment.App.FragmentManagerImpl.DispatchStateChange(FragmentManagerImpl.Java:2663)位于AndroidX.Fragment.App.FragmentManagerImpl.DispatchActivityCreated(FragmentManagerImpl.Java:2613)位于AndroidX.Fragment.App.FragmentController.DispatchActivityCreated(FragmentController.DispatchActivityCreated(FragmentController.Java:246)位于Ansaction.TransactionExecutor.Execute(TransactionExecutor.java:70)在Android.app.ActivityThread$H.HandleMessage(ActivityThread.java:1831)在Android.os.Handler.DispatchMessage(ActivityThread.java:201)在Android.app.ActivityThread.Main(ActivityThread.java:6806)在Android.app.ActivityThread.Main(ActivityThread.java:6806)在java.lang.Reflect.Method.Invoke(原生方法)在

共有2个答案

柯曜文
2023-03-14

我认为问题出在您的homeModule中的var homeFragment:homeContract.view。我建议您重写HomePresenter并替换通过构造函数将HomeFragment传递到方法bindview/unbindview。

class HomePresenter(private val interactor: HomeInteractor) {
    var view: HomeView? = null

    fun bindView(view: HomeView) {
        this.view = view
    }

    fun unbindView() {
        view = null
    }
}

在presenter中存储片段引用可能会导致内存泄漏和空指针异常(当片段被破坏而presenter未被破坏时)。

欧阳哲
2023-03-14

您正在尝试通过应用程序的主组件注入homeModule中提供的演示器。这是行不通的,因为您从未向AppComponent提供HomeModuleHomeModule甚至不应该是AppComponent的一部分,因为它提供的东西(presenter和interactor)仅在片段存在时才存在,这意味着它们存在于片段范围内,而不是应用程序范围内。

您需要做的是创建另一个组件,它将注入到您的片段中,例如。

kotlin prettyprint-override">@Component(
    modules = [
        (HomeModule::class)
    ]
)
interface HomeComponent {
    fun inject(homeFragment: HomeFragment)
}

然后在主页:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    DaggerHomeComponent
        .builder()
        .homeModule(HomeModule(this))
        .build()
        .inject(this)
}

如果您需要来自应用程序范围(来自网络和应用程序模块)的东西,那么您可以像以前一样通过AppComponent注入它们。

 类似资料:
  • 我不知道这是怎么回事 主要活动 我遇到了这个问题 2022-03-18 09:18:27.393 13874-13874/com。实例githubuser2 E/AndroidRuntime:致命异常:主进程:com。实例githubuser2,PID:13874 java。lang.RuntimeException:无法启动活动组件信息{com.example.githubuser2/com.e

  • 我正在尝试使用Spring-boot+Vaadin创建一个web项目,并且希望使用spring-data-jpa和hibernate从PostgreSQL数据库中获取数据。 在我的Vaadin看来,我尝试自动连接我的服务类,但我总是得到null,而且eror堆栈跟踪没有告诉我原因。 数据库得我得配置: 视图和UI: pom.xml: 我的服务: 更新的解决方案:

  • 当变量只在OnCreate中声明时,为什么我的片段不进入onCreateView?

  • 我的代码成功构建,但每当我运行它时都会出现异常。不知道为什么匕首2不初始化变量。请告诉我哪里错了。给出以下例外情况: UninitializedPropertyAccessException:lateinit属性databaseService尚未初始化 依赖关系:

  • 我经常得到。但这个应用程序运行得很好。注意:我不想将演示者注入到活动中。提前谢谢! 以下是我的活动: 这是我的主持人: 这是我的数据管理器: 和AppDataManager: 最后,我的测试失败了: gradle文件: 我的模块课程: 实际错误是科特林。UninitializedPropertyAccessException:lateinit属性dataManager尚未初始化

  • Json服务器数据显示,在使用retrofit2和rxjava2的android中,当参数传递给inteface时,会出现错误。 接口