@Inject for Hilt 给出 UninitializedPropertyAccessException

问题描述 投票:0回答:4

我在我的项目中使用 Hilt,除了这个文件之外,它在任何地方都工作正常。

abstract class SomeFile {
  
    @Inject
    lateinit var useCase: UseCase

    fun setData() {
       if (useCase.driver == 1){ do something }
       else { do something }
    }
}

同样的“UseCase”注入正在另一个文件中工作,例如视图模型和活动。但只有在这个抽象类文件中我才得到这个异常。这里可能有什么问题?

模块类

@Module
@InstallIn(SingletonComponent::class)
object HiltUseModule {
    @Provides
    @Singleton
    fun getUseCase(stateMachine: StateMachine): UseCase {
        return createProxyInstance(stateMachine)
    }
}

应用程序不会崩溃或发生任何事情。它只是转到 if 条件并且不执行任何操作。我使用 debug 来检查那里“useCase”的值是什么,它显示了异常 UninitializedPropertyAccessException。

提前致谢。

android kotlin inject dagger-hilt
4个回答
2
投票

您应该使用构造函数注入来获取

SomeFile
的实例,而不是字段注入。

class SomeFile @Inject internal constructor(private val useCase: UseCase) {
  fun setData() {
    if (useCase.driver == 1){ do something }
      else { do something }
    }
  }
}

然后,您需要将其注入到某个作为入口点的组件中(无论是您的

ViewModel
Fragment
还是
Activity

@AndroidEntryPoint(AppCompatActivity::class)
class MyActivity : Hilt_AppCompatActivity() {
  @Inject internal lateinit var someFile: SomeFile

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    someFile.setData()
  }
}

0
投票

试试这个:

abstract class SomeFile {
 
    fun setData(useCase : UseCase) {
       if (useCase.driver == 1){ do something }
       else { do something }
    }
}

它的作用是你传入函数的参数会从任何可能的地方找到UseCase的对象。


0
投票

您需要将依赖项作为参数传递。您可以将其设为 @Inject 构造函数。或者让任何创建它的东西将其传递进去。

abstract class SomeFile @Inject constructor(val useCase: UseCase){

    fun setData() {
       if (useCase.driver == 1){ do something }
       else { do something }
    }
}

-1
投票

在 Hilt 支持的类中注入依赖项

如果您需要在 Hilt 不支持的类中执行字段注入。

你需要使用

@EntryPoint
注释

  @EntryPoint
  @InstallIn(SingletonComponent::class)
  interface MyEntryPoint {
    fun getUseCase(): UseCase
  }
  

并使用

访问用户类别
val hiltEntryPoint = EntryPointAccessors.fromApplication(appContext,MyEntryPoint::class.java)
val useCase = hiltEntryPoint.getUseCase()
© www.soinside.com 2019 - 2024. All rights reserved.