我在我的项目中使用 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。
提前致谢。
您应该使用构造函数注入来获取
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()
}
}
试试这个:
abstract class SomeFile {
fun setData(useCase : UseCase) {
if (useCase.driver == 1){ do something }
else { do something }
}
}
它的作用是你传入函数的参数会从任何可能的地方找到UseCase的对象。
您需要将依赖项作为参数传递。您可以将其设为 @Inject 构造函数。或者让任何创建它的东西将其传递进去。
abstract class SomeFile @Inject constructor(val useCase: UseCase){
fun setData() {
if (useCase.driver == 1){ do something }
else { do something }
}
}
在 Hilt 支持的类中注入依赖项
如果您需要在 Hilt 不支持的类中执行字段注入。
你需要使用
@EntryPoint
注释
@EntryPoint
@InstallIn(SingletonComponent::class)
interface MyEntryPoint {
fun getUseCase(): UseCase
}
并使用
访问用户类别val hiltEntryPoint = EntryPointAccessors.fromApplication(appContext,MyEntryPoint::class.java)
val useCase = hiltEntryPoint.getUseCase()