gpt4 book ai didi

android - 如何使用 Navigation Compose 进行辅助注入(inject)?

转载 作者:行者123 更新时间:2023-12-04 23:39:54 28 4
gpt4 key购买 nike

我有一个名为 ParentScreen 的组合和 ViewModel命名为 ParentViewModel .里面ParentViewModel ,我正在从我的 repo 中收集值(value)。

class MyRepo @Inject constructor() {
fun getParentData() = System.currentTimeMillis().toString() // some dummy value
}

@HiltViewModel
class ParentViewModel @Inject constructor(
myRepo: MyRepo
) : ViewModel() {
private val _parentData = MutableStateFlow("")
val parentData = _parentData.asStateFlow()

init {
val realData = myRepo.getParentData()
_parentData.value = realData
}
}

@Composable
fun ParentScreen(
parentViewModel: ParentViewModel = hiltViewModel()
) {
val parentData by parentViewModel.parentData.collectAsState()
ChildWidget(parentData = parentData)
}
里面 ParentScreen可组合的,我有一个 ChildWidget可组合的,它有自己的 ViewModel命名为 ChildViewModel .
@HiltViewModel
class ChildViewModel @AssistedInject constructor(
@Assisted val parentData: String
) : ViewModel() {

@AssistedFactory
interface ChildViewModelFactory {
fun create(parentData: String): ChildViewModel
}

init {
Timber.d("Child says data is $parentData ")
}
}

@Composable
fun ChildWidget(
parentData: String,
childViewModel: ChildViewModel = hiltViewModel() // How do I supply assisted injection factory here?
) {
// Code omitted
}
现在,我想得到 parentData里面 ChildViewModel的构造函数。
问题
  • 我如何供应ChildViewModelFactory前往 Navigation Compose 的 hiltViewModel方法?
  • 如果这不可能,那么将对象从父可组合注入(inject)到子可组合的 ViewModel 的最合适方法是什么? ?创建一个 lateinit 怎么样?属性(property)和init像下面这样的方法?

  • @HiltViewModel
    class ChildViewModel @Inject constructor(
    ) : ViewModel() {
    lateinit var parentData: Long

    fun init(parentData: Long){
    if(this::parentData.isInitialized) return
    this.parentData = parentData
    }
    }

    最佳答案

    您可以使用 EntryPointAccessors (来自 Hilt)和 ViewModelProvider.Factory来自 View 模型库。
    在我的 sample app , BookFormScreen正在使用 BookFormViewModel并且 View 模型需要根据 bookId 加载一本书通过前一个屏幕。这就是我所做的:

    class BookFormViewModel @AssistedInject constructor(
    ...
    @Assisted private val bookId: String?,
    ) : ViewModel() {

    ...

    @AssistedFactory
    interface Factory {
    fun create(bookId: String?): BookFormViewModel
    }

    companion object {
    @Suppress("UNCHECKED_CAST")
    fun provideFactory(
    assistedFactory: Factory, // this is the Factory interface
    // declared above
    bookId: String?
    ): ViewModelProvider.Factory = object : ViewModelProvider.Factory {
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
    return assistedFactory.create(bookId) as T
    }
    }
    }
    }
    请注意,我没有使用 @HiltViewModel . provideFactory将用于提供工厂来创建此 View 模型。
    现在,您需要定义一个可组合的函数来使用该工厂提供 View 模型。
    @Composable
    fun bookFormViewModel(bookId: String?): BookFormViewModel {
    val factory = EntryPointAccessors.fromActivity(
    LocalContext.current as Activity,
    ViewModelFactoryProvider::class.java
    ).bookFormViewModelFactory()

    return viewModel(factory = BookFormViewModel.provideFactory(factory, bookId))
    }
    如果您使用导航库,可以添加 ViewModelStoreOwner此函数中的参数并在 viewModel() 中使用函数调用。对于此参数,您可以传递 NavBackStackEntry对象,有了这个, View 模型将被限定到那个特定的回栈条目。
    最后,您可以在可组合文件中使用您的 View 模型。
    val bookFormViewModel: BookFormViewModel = bookFormViewModel(bookId)

    关于android - 如何使用 Navigation Compose 进行辅助注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70174711/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com