将 mutableState 与 jetpack 结合使用时的最佳实践在视图模型内组合并公开可变状态

ant*_*009 6 kotlin android-jetpack-compose kotlin-stateflow

我有以下视图模型

@HiltViewModel
class ShareViewModel @Inject constructor(
    private val taskRepository: TaskRepository
): ViewModel() {

    private val searchAppBarStateMutableState: MutableState<SearchAppBarState> = mutableStateOf(SearchAppBarState.CLOSED)
    val searchAppBarState: State<SearchAppBarState> = searchAppBarStateMutableState

    private val listOfTaskMutableStateFlow = MutableStateFlow<List<TodoTaskEntity>>(emptyList())
    val listOfTaskStateFlow = listOfTaskMutableStateFlow.asStateFlow()
}
Run Code Online (Sandbox Code Playgroud)

我从不像上面的例子那样公开 mutableStateFlow。这样做时 SonarLint 会显示警告。

MutableStateFlow" and "MutableSharedFlow" should not be exposed
Run Code Online (Sandbox Code Playgroud)

所以我将同样的技术应用于mutableState

但是,如果我这样做,我不会收到任何警告。

val searchAppBarStateMutableState: MutableState<SearchAppBarState> = mutableStateOf(SearchAppBarState.CLOSED)
Run Code Online (Sandbox Code Playgroud)

只是想知道将 MutableState 与 jetpack compose 结合使用的最佳实践是什么。

sar*_*pta 7

要将 mutableState 与 viewmodel 一起使用,请在 viewmodel 内使用私有 setter 定义 mutableState,例如 -

var isVisible by mutableState(false)
    private set
Run Code Online (Sandbox Code Playgroud)

通过执行上述操作,我们可以从视图模型外部读取可变状态,但不能更新它。要更新在视图模型中创建公共函数,例如 -

fun setVisibility(value: Boolean) {
    isVisible = value
}
Run Code Online (Sandbox Code Playgroud)

通过创建 setter 函数,我们遵循关注点分离,并拥有编辑 mutableState 的单一事实来源。