完全将Android ViewModel的实现与匕首刀

发布于 2025-01-27 23:59:52 字数 1071 浏览 5 评论 0原文

目前,我有类似的东西:

interface MyViewModel {
    val elements: StateFlow<List<MyElements>>
    val visible: StateFlow<Boolean>

    fun onClick(button: MyElement)
}

@HiltViewModel
class MyViewModelImpl @Inject constructor(
    private val myUseCases: MyUseCases,
) : ViewModel(), MyViewModel {

    override val elements: StateFlow<List<MyElements>> = myUseCases.getList()
    override val visible: MutableStateFlow<Boolean> by lazy { MutableStateFlow(false) }

    override fun onClick(button: MyElement) {
        myUseCases.click(button)
        ...
    }
}

@Composable
fun MyComposable(
    myViewModel: MyViewModel = hiltViewModels<MyViewModelImpl>(),
) { ... }

我想知道是否有某种方法可以将我的合成类完全解脱为我的ViewModel实现类(即删除&lt; myviewModelimpl&gt; in hiltviewModels())。我已经尝试了一些不同的事情,例如将接口作为抽象类和创建@binds@provides Methods in dagger Hilt @module s,但我似乎无法正确。理想情况下,组合性应该不知道实现ViewModel类,以便我可以将其更改以进行测试等。这将是一个很大的帮助,因为我有几个注入相同的ViewModel接口的组合。

Currently, I have something similar to:

interface MyViewModel {
    val elements: StateFlow<List<MyElements>>
    val visible: StateFlow<Boolean>

    fun onClick(button: MyElement)
}

@HiltViewModel
class MyViewModelImpl @Inject constructor(
    private val myUseCases: MyUseCases,
) : ViewModel(), MyViewModel {

    override val elements: StateFlow<List<MyElements>> = myUseCases.getList()
    override val visible: MutableStateFlow<Boolean> by lazy { MutableStateFlow(false) }

    override fun onClick(button: MyElement) {
        myUseCases.click(button)
        ...
    }
}

@Composable
fun MyComposable(
    myViewModel: MyViewModel = hiltViewModels<MyViewModelImpl>(),
) { ... }

I would like to know if there is some way to completely decouple my Composable from my ViewModel implementation class (i.e. remove the <MyViewModelImpl> in hiltViewModels()). I've tried a few different things, such as making the interface an abstract class and creating @Binds and @Provides methods in Dagger Hilt @Modules, but I can't seem to get it right. Ideally, the Composable should have no knowledge of the implementing ViewModel class so that I can change it for testing etc. This would be a big help because I have several composables that inject the same ViewModel interfaces.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文