在Compose的官方指导和示例代码中经常会看到这样的代码

 var count by remember{mutableStateOf(0)}
或者
v变量之间的联系ar count =androidstudio装置教程 remember{mutableStateOf(0)}

首先需求留心几个问题

  1. 用by的话,count是Int类型【即mutableStateOf参数的类型】
  2. 用“=”, count是MutableState类型,运用时需求通过.value来取值
  3. 运用by的时分或许会报红,错误是

Type ‘TypeVariable(Tandroid什么意思)’ has no method ‘getValue(Nothing?,变量的定义 KProperty<*>)’ and thus it cannot serve as a delegate

解决办法很简单,导包即可

impor变量名的命名规矩t androidx.compose.runti缓存视频怎样转入相册me.getValue
import androidx.compose.runtime.setValue
也可以直接:
import androidx.compose.变量名的命名规矩runtime.变量名的命名规矩*

这个问题或许是Compose的一个bug,假如仅仅 by mutableStateOf(0),也会报错,可是按alt+enter 会提示需求导包,可是加了remember之后,按alt+enter是不提示导包的,十分古怪。
4. 留心remandroid的drawable类ember 后变量的定义边是 {} , 不是(缓存整理)

进入正题,来看看mutableStateOf 和 remember 都是干嘛的

一般参数缓存
class MainActivity : ComponentActivity() {
@ExperimentalMaterialApi
override fun onCreate(savedInstanceState: Bundle?) {
super.onCrea缓存te(savedInstanceState)
setConte变量与函数教案nt {
pandroid的drawable类rintln("---- clicked onCreatandroid手机ed setContent ")
Surface() {
var count =变量名的命名规矩 0 // 无情况
Button(
onClick = { count++ }, modifier = Modifier
.padding(变量与函数16.dp)
.fillMaxWidth()
.height(50.dp)
) {
Text(
text = "I have been clicked $count times",
modifier = Modifier.align(Alignment.CenterVertically)变量是什么意思
)
SideEffect(effect = { println("---- text count = $countandroid下载 ") })
}
SideEffect(effect缓存文件在哪里 = { pri变量值ntln("--缓存视频变成本地视频-- out c变量名的命名规矩ount = $count ") }变量名)
}
}
}
}

点击按钮,数字不变,控制台只需一次打印

2021-05-26 10:21:45.248 32194-32194/com.shakespace.compose I/System.out: ---- clicked onCreated setContent
2021-05-26 1android下载装置0:21:45.301 32194-321变量类型有哪些94/com.shakespace.compose I/System.out: ---- text count = 0
2021-05-26 10:21:45.301 32194-32194/com缓存视频在手机哪里找.shakespace.compose I/System.out缓存: ---- out count = 0
有情况参Android
var count by mutableStateOf(0) // 改成mutableStateOf

点击变量与函数按钮,数字会不断增加,控制台输出

2021-05-26 10:26:36.949 16988-16988/com.shakeandroid是什么手机牌子space.compose I/System.out: ---- clicked onCreated setContent
2021-05-26 10:26:37.002 1698缓存整理8-16988/缓存视频兼并app下载co缓存视频在手机哪里找m.shakespace.compose I/System.out: -android体系--缓存视频变成本地视频- text count = 0
2021-05-26 10:2变量名的命名规矩6:37.002 16988-16988/com.shakespace.compose I/System.out: ---- out c缓存视频ount = 0
2021-05-缓存26 10:26:40.511 16988-1变量泵6988/com.shakesp变量是什么意思ace.compose I/System.out: ---- text count = 1
2021-05-缓存的视频怎样保存到本地26 10:26:41.141 16988android平板电脑价格-16988/com.shakespace.compose I/System.out: ---- text count = 2
2021-05-26 10:26:41.792 16988-16988/com.shakespace.compose I/System.out: ---- text count = 3
2021-05-26 10:26:42.828 16988-16988/com.shakespace.compose I/System.out: ---- t变量与函数教案ext coun缓存视频兼并t = 4
2021-05-26 10:26:43.596android下载 16988-16988/com.shakespace.compose I/System.out: -变量泵--- text count = 5
  1. 比较一般变量变量泵,运用mutableStateOf,使得变量有了被观缓存文件在哪里察的才能,当值发生改动时就会告诉运用这个变量的控件进行更新。
  2. 问题是这儿没有用到remember,点击时数字仍是缓存视频兼并app下载会增加,是不是不需求remember呢?
重绘机制

把Button 的paddinandroidstudio装置教程g 改成和count变量 有关

 setContent {
println("---- clicked onCreated setContent ")
Surface() {
var count by mutableStateOf(0)
Button缓存的视频怎样保存到本地(
onClick = { count++ }, modifier = Modifier
.padding(coandroid下载装置unt.dp) // 把Button的paddinandroid的drawable类g 改成和count 有关
.fillMaxWidth()
.heigandroidstudio装置教程ht(50.dp)
) {
Text(
text = "I have been clicked $count times",
modifier = Modifier.align缓存(Alignment.CenterVertically)
)
SideEffandroid开发ec变量之间的联系t(effect = { p变量与函数教案rintln("---- text count = $count ") })
}
SideEff变量与函数教案ect(effect = { println("---- out count = $count ") })
}
}

点击按钮,数字不会改动,控制台输出

2021-05-26 1缓存的视频怎样保存到本地1:49:28.394 19077-19077/com.shakespace.comp缓存视频ose I/System.out: ---- clicked onCreated setContent
2021-05-26 11:49:28.450 19077-19077/com.shakespace.compo变量泵se I/System.out: ---- text count = 0
2021-05-26 11:49:28.450 19077-19077/com.shakespace.candroid体系ompose I/System.out: ---- out count = 0
202缓存文件在哪里1-05-26 11:49:33.240 1android体系9077-19077/com.shakespace.com变量类型有哪些pose I/System.out: ---- text count = 0
2021-05-26 11:49:33.240 19077-变量类型有哪些19077/com.shakespaandroid手机ce.Androidcompose I/Syste缓存视频在手机哪里找m.out: ---- out count = 0
2021-05-26 11:49:34.123 19077-19077/com.shakespace.compose I/System.out: ---- text count缓存文件在哪里 = 0
2021-缓存视频变成本地视频05-26 11:49:34.123 1缓存文件在哪里9077-19077/com.shakeandroid是什么手机牌子space.compose I/System.out: ---- out count = 0
2021-05-26 11:49:35.776 19077变量值-19077/com.shakespace.compose I/System.缓存视频out: ---- text count = 0
2021-05-26 11:49:35.776 19077-19变量与函数教案077/com.shakespace.compose I/System.out: ---- out count = 0

这时分数字不会改动,是因为android平板电脑价格Surface的直接子组件Button依赖于count这个state,那么count改动的时分,Sur缓存face接收的这个Composable函数就会重绘[办android什么意思法从头调用],每次调用count就会是0,所以数字没有改动。

而前面Button不依赖于c缓存视频ount的比如,外部不需求重绘(看日志 out 只打印了一次),count也不会重置,所以数字会增加。

reme变量之间的联系mb缓存的视频怎样保存到本地er

在这种情况下,假如还想记住变量值,就要用到r缓存文件在哪里emember

        setContent {
println("---- clicked onCreated setContent ")
Surface() {
var count by remember{ mutableStateOf(0)} // 运用remember
Button(
onClicandroidstudio装置教程k = { count++ }, modifier = Mo变量是什么意思difier
.padding(count.dp)
.fillMaxWidth()
.height(50.dp)
) {
Text(
text = "I变量 have been clicked $count times",
modifie缓存视频变成本地视频r = Modifier.align(Alignment.CenterVertically)
)
SideEffect(effect = { println("---android手机- text count = $count ") })
}
SideEffect(effect = { println("---- out count = $count ") })
}
}

点击按钮,数字会增加,控制台输出:

2021-05-26 11:56:28.Android675 5449-5449/com.shandroid下载装置akespace.compose I/System.out: ---- clicked onCreated setContent
2021-05-26 11:56:28.728 5449-54android开发49/com.shakespace.android什么意思compose I/System.ou变量泵t: ---- text count = 0
2021-05-26 11:56android什么意思:28.729 5449-5449/com.shakespace.compose I/System.out: ---- out count = 0
2021-05-26 11:5android什么意思6:36.311 5449-5449/com.shakespace.candroid手机ompose I/System.out: ---- text c变量类型有哪些ount = 1
2021-05-26 11:56:36.311 5449-5449/com.shakespace.变量泵compose I/System.out: ---- out count = 1
2021-05-26 11:56:36.840 5449-5449/comandroid的drawable类.shakespace.compose I/System变量类型有哪些.out: ---- text count = 2
2021-05-26 11:56:36.840 5449-5449/com.shak缓存视频兼并espace.com缓存视频兼并pose I/System.out: ---- out count = 2
2021-05-26android什么意思 11:56:37.206 5449-5449/com.shakespace.compose I/System.out: ---- text count = 3
2021-05-26 11:56:37.206 5449-5449/com.s变量是什么意思hakespace.compose I/System.out: ---- out count = 3

外部仍是会重绘,可是每次值都会内存缓存中读取,这便是remember的作用,当当时Composable重绘的时分,可以暂存变量值。

假如把变量放在外面?
        setContent {
println("---- clicked onCreated setContent ")
var count by mutableStateOf(0) /缓存视频变成本地视频/ 移到外面,不适用rememb变量是什么意思er
Surface() {
Button(
onClick = { count++ }android下载装置, modifi变量er = Modifier
.padding(count.dp)
.fandroidstudio装置教程illMaxWidth()
.height(50.dp)
) {
Text(
text = "I have been cl缓存视频icked $count times",
modifier = Modifier.align(Alignment.CenterVertically)
)
SideEffect(effect = { println("---- text count = $count ") })
}
SideEffect(effect = { println("---- out count = $count ") }缓存视频在手机哪里找)
}
}

数字会增加,控制台输出

2021-05-26 12:03:32.605 9375-9375/com.shakespace.android的drawable类compose I/System.out: ---- c变量l缓存视频在手机哪里找icked onCreated setContent
2021-05-26 1变量与函数教案2:03:32.658 9375-9375/com.shakespa缓存视频ce.compose I/Sandroid平板电脑价格ystem.ouandroid下载t: ---- text count = 0
2021-05-26 12:03:32.658 9375-9375/comandroid下载装置.shakespace.compose I/System.out: ---- out count = 0
2021-05-26 12:03:35.100 9375-93android开发75/com.shakespace.compose I/System.out: ---- text count = 1
2021-05-26 12:03缓存文件在哪里:35.Android100 9375-9375/com.shakespandroid什么意思ace.compose I/System.out: ---- out count = 1
2021-05-26 12:03:38.646 93android体系75-9375/com.shakespace.compose I/System.缓存整理out: ---- text count = 2
2021-05-26 12:03:38.Android646 9375-9375/com.shakespace.compose I/System变量与函数教案.out: ---- out count = 2
2021-05-26 12:03:39.642 9375-9375/com.shakespace.compose I/System变量之间的联系.out: ---缓存视频兼并- text count = 3
2021-05-26 12:03:39.642 9375-9375/c变量泵om.shakespace.compose I/System.out: ---- out count = 3

这和重绘那个比如是类似的,setContent的参数也是个Composable,Surface作为直接子类,并没有依赖于count,所以本身不会重绘,count也不缓存视频在手机哪里找会被重置。

可是

假如咱们把上面的Surface换成Column之类的Composable,其他都不变,成果就不相同了

2021-05-26 12:07:16.163 9780-9780/com.shakespace.compose I/System.out: ---- clicked onCreated setContent
2021-05-26 12:07:16.166 9780-978Android0/com.shakespace.compose I/System.out: ---- text count = 0
2android体系021-05-26 12:07:16.166 9780-9780/com.shakespace.compose I/System.out: ---- out count缓存视频怎样转入相册 = 0
202androidstudio装置教程1-变量名的命名规矩05-26 1变量与函数教案2:07:17.047 9780-9780/com.shakespace.compose I/System.out: ---- clicked onCreated setandroid的drawable类Content
2021-05-26 12:07:17.050 97变量泵80-9780/com.shakespace.compose I/Sandroid开发ystem.out: ---- text count = 0
2021-05-26 12:07:17.050 9780-9780/com.shakespace.compandroid下载装置ose缓存视频兼并 I/android下载装置System.out: ---- o缓存视频在手机哪里找ut count = 0
2021-05-26 12:07:17.883 9780-9780/com.shakespace.compose I/System.out: ---- clicked onCreated setContent
2021-05-26 12:07:17.885 9780-9780/com.sh缓存文件在哪里akespace.compose I/System.out: ---- text count = 0
2021-05-26 12:07:17.885 9780-9780/com.shaandroid的drawable类kespace.composandroid的drawable类e I/System.out: ---- out c缓存视频兼并app下载ount = 0

数字不变,并且 “clicked onCreated setContent” 每次都打印,说明setCandroid的drawable类ontent里面的Composable每次都会重绘

现在所能知道的是,Column、Row、Box之类的组件,传入的Composable参数是给对应的Scope的扩展函数,而Surface接收的便是一个一般的Composable函数,一个或许不行准确的结论是:扩展函数中的直接组件重绘的话,相当于接收这个扩展函数的组件也要重绘。【即Button需求重绘,Column也会重绘】