Android 使用compose创建应用程序时,此处要使用的适当Kotlin流是什么?

Android 使用compose创建应用程序时,此处要使用的适当Kotlin流是什么?,android,android-jetpack-compose,kotlin-stateflow,Android,Android Jetpack Compose,Kotlin Stateflow,下面是活动类 class MainActivity : ComponentActivity() { private val viewModel: MainViewModel by viewModels { MainViewModelProvider() } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setCont

下面是活动类

class MainActivity : ComponentActivity() {

    private val viewModel: MainViewModel by viewModels { MainViewModelProvider() }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            StateExampleTheme {
                // A surface container using the 'background' color from the theme
                Surface(color = MaterialTheme.colors.background) {
                    val state by viewModel.viewStatePublisher.collectAsState()

                    when (state) {
                        is ViewState.Failure -> {
                        }
                        ViewState.InProgress -> {
                        }
                        is ViewState.Success -> {
                            val event = (state as ViewState.Success).data
                            Greeting(event, viewModel)
                        }
                    }
                }
            }
        }
    }
}

@Composable
fun Greeting(event: Event, viewModel: MainViewModel) {
    Column {
        Text(text = "Hello ${event.data}!")
        Button(onClick = {
            viewModel.updateState(event)
        }) {
            Text(text = "Click")
        }
    }

}
视图模型是

class MainViewModel : ViewModel() {
    private val _viewStatePublisher: MutableStateFlow<ViewState> =
        MutableStateFlow(ViewState.Success(Event(0)))
    val viewStatePublisher: StateFlow<ViewState> = _viewStatePublisher

    fun updateState(event: Event) {
        event.data = event.data + 1
        viewModelScope.launch {
            _viewStatePublisher.emit(ViewState.Success(newEvent))
        }
    }
}

class MainViewModelProvider : ViewModelProvider.Factory {
    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        if (modelClass.isAssignableFrom(MainViewModel::class.java)) {
            return MainViewModel() as T
        }
        throw IllegalArgumentException("Unknown ViewModel class")
    }
}
事件类是

data class Event(var data: Int)
有了以上内容,我无法在单击按钮时更新UI,我需要知道
StateFlow
是否是实现这一点的正确方法

您可以建议将
事件更改为以下内容

data class Event(val data: Int)
并将
updateState()
方法更新为

fun updateState(event: Event) {
        val newEvent = event.copy(data = event.data + 1)
        viewModelScope.launch {
            _viewStatePublisher.emit(ViewState.Success(newEvent))
        }
    }
但是我希望
数据
是可更改的
,并在
数据
更改时更新
状态


谢谢你所做的违背了语言设计,
StateFlow
无法告知基础数据已更改,因此它不会向任何订阅服务器通知新数据


我同意在数据类中使用
不可变的
,为什么您需要它是可变的/var?

我有一个巨大的树,不想在每次更改后都复制,所以只想有一个
可变的
var并更新
用户界面
。我不想违背设计语言,所以我想问的是,合适的设计语言将使用什么来代替
StateFlow
?如果您想优化,请将单个
ViewState
类拆分为多个较小的块或原语。这样,您可以只更新所需的零件。对于处理加载、成功和错误状态,您还可以创建单独的
StateFlow
fun updateState(event: Event) {
        val newEvent = event.copy(data = event.data + 1)
        viewModelScope.launch {
            _viewStatePublisher.emit(ViewState.Success(newEvent))
        }
    }