android 哪一层应该验证用户在jetpack合成中的输入

xdnvmnnf  于 2022-11-27  发布在  Android
关注(0)|答案(1)|浏览(91)

我正在开发一个android应用程序,我的用例需要验证一些用户的输入。
作为一个例子,我有深度值(在现实中,它有超过20个输入),这应该是3和100之间的东西。因为它是由用户提供的信息做一些计算,我有一个对话框,我的问题是:如何使用视图模型真实的验证输入(这是验证输入的正确方法吗?)。

fun validateDepth(depth: String): Boolean {
    return depth.isNotBlank() && depth.toIntOrNull() != null && depth.toInt() in 3..100
}

然后再

DepthPicker(
    value = depthValue,
    onValueChange = onDepthValueChange,
    validator = DepthValidator::validateDepth // <---- HERE: I dind't like this part
)

但是我不喜欢UI而不是ViewModel进行验证的事实,这使得它很难测试。并且深度值必须在发送到存储库之前进行验证。
我的对话框是一个简单的可组合

Dialog(onDismissRequest = onDismissRequest) { 
    ...
    TextField(...)
}

UI状态

data class UiState(val depth: Int?)

检视模型

@HiltViewModel
class DepthViewModel @Inject constructor(
    private val depthRepository: DepthRepository,
) : ViewModel() {
    private val _uiState = MutableStateFlow(DepthUiState())
    val uiState = _uiState.AsStateFlow()

    fun updateDepth(depth: Int?) = _uiState.update { it.copy(depth = depth) }
    ....
}

TL;DR:如何/在何处验证用户在键入时在带有文本字段的对话框中的输入?如果用户已输入有效值,然后决定更改它,请单击编辑,将其更改为无效值,然后单击取消,则必须显示旧的有效值。

nhn9ugyo

nhn9ugyo1#

您可以使用UseCase或Interactor类在域层内部执行此操作,此类仅包含非Android类、对象或函数,便于在需要时进行单元测试或移动到另一个ViewModel。UseCase是处理业务逻辑的单一责任类,如The Clean Architecture by Robert C. Martin (Uncle Bob)中所述
用例此层中的软件包含应用产品特定的业务规则。它封装和实施系统的所有用例。这些用例编排实体之间的数据流,并指导这些实体使用其企业范围的业务规则来实现用例的目标。
我们不希望这一层的变化影响实体,也不希望这一层受到外部因素(如数据库、UI或任何公共框架)变化的影响,这一层与这些问题隔离。
以及Android的官方文档什么是域层,以及如何使用它与Jetpack合成。你可以检查JetNews应用程序或ioshed应用程序的更多细节。
这个圆圈块是如何转换成Android的,如图所示。
https://developer.android.com/topic/architecture/domain-layer

相关问题