remember状态管理

1 remember + mutableStateOf

核心思想 :Compose 是声明式 UI:UI = f (State)
状态变化 → 触发重组 → UI 自动刷新;
状态必须是可观察的(State/Flow),普通变量修改不会触发重组。

作用:mutableStateOf<T>() 创建可观察状态;remember 在重组时保留状态,组件销毁才丢失。


 `by` 委托属性:简化 `.value` 读写
  适用:**组件内部临时 UI 状态**(开关、输入框文字、弹窗显隐)

1 基础状态 示例
@Composable
fun Counter() {
    // 本地状态,仅当前组件使用  
    var count by remember { mutableStateOf(0) }

    Button(onClick = { count++ }) {
        Text("计数:$count")
    }
}

2 状态提升示例
子组件不要持有可变状态,父组件把状态 + 回调传给子组件:
// 父组件:持有状态
@Composable
fun Parent() {
    var count by remember { mutableStateOf(0) }
    // 把状态和修改事件传给子组件
    Child(count = count, onAdd = { count++ })
}

// 子组件:纯展示,不修改状态,只向上抛事件
@Composable
fun Child(count: Int, onAdd: () -> Unit) {
    Button(onClick = onAdd) {
        Text("$count")
    }
}

2 状态放到 ViewModel(业务状态,页面级) ViewModel + StateFlow

ViewModel 中的状态:配置变更(旋转、黑夜模式切换)不会销毁,适合业务数据、列表、接口返回数据。
搭配 StateFlow / MutableStateFlow

适用:**接口数据、分页列表、业务表单数据**,页面级状态首选。

class PageViewModel : ViewModel() {
    private val _count = MutableStateFlow(0)
    val count: StateFlow<Int> = _count // 对外只读

    fun add() {
        _count.value +=1
    }
}

@Composable
fun Page(vm: PageViewModel = viewModel()) {
    // collectAsState:把Flow转为Compose State,自动订阅+取消
    val count by vm.count.collectAsState()
    Button(onClick = { vm.add() }) {
        Text("count $count")
    }
}



©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容