rememberUpdatedState 例子理解

rememberUpdatedState 官方解释就不扯这么多了,知道怎么用就完了。
其实就是把一个非状态的参数变成有有状态
直接上例子 注意注释

@Composable
fun Greeting() {
  //这是一个有状态的btnColor
    var btnColor by remember {
        mutableStateOf("unknown")
    }
    //方式一:将btnColor作为参数传递到另一个可组合方法中
    timer(btnColor = btnColor)
    //方式二:直接使用btnColor
    LaunchedEffect(key1 = Unit, block = {
        delay(8000)
//因为在这个作用域里,btnColor是有状态的,所以延迟过后能打出更新的值
        Log.e(">>>", "out btnColor: $btnColor")
    })
    //点击btn时,会重组。
    Column {
        OutlinedButton(onClick = {
            btnColor = "black"
        }) {
            Text(text = "black btn")
        }
        OutlinedButton(onClick = {
            btnColor = "white"
        }) {
            Text(text = "white btn")
        }
    }
}

@Composable
fun timer(btnColor: String) {//这里的btnColor 是无状态的
    Log.e(">>>", "compose: $btnColor")
//只有把无状态的btnColor转成有状态的,也就是要state,后续的改变值才能正常获取,
//rememberUpdatedState的作用就是第一次进入的时候生成一个新的有状态的btnColor,第二次再进
//去,直接出发 apply 更新值。
    var rememberBtnColor = rememberUpdatedState(newValue = btnColor)

//单纯用remember,是没用的,因为没有状态
//    var rememberBtnColor = remember { btnColor }

//这样也是没用的,第二次赋值导致rememberBtnColor 
// 是一个新的对象,并不是改变状态值,由于key1 = Unit 并不会更新LaunchedEffect里面的 { } 内容
//    var rememberBtnColor  by remember(btnColor) {
//        Log.e(">>>", "remember compose: $btnColor")
//        mutableStateOf(btnColor)
//    }


    LaunchedEffect(key1 = Unit, block = {
        delay(5000)
        Log.e(">>>", "timer btnColor: $btnColor")
        Log.e(">>>", "timer remember btnColor: ${rememberBtnColor}")
    })
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容