ºÜ¶à Kotlin ¿ª·¢ÕßµÚÒ»´Î¿´µ½ val strList: StateFlow<...> = _strList ºÍ val strList: StateFlow<...> = _strList.asStateFlow() ʱ£¬¶¼»á¾õµÃÁ½Õß¼ÈÈ»¶¼ÄÜÅÜͨ£¬ÎªÊ²Ã´»¹Òª¶àдһ²½¡£ÕæÕýµÄ²î±ð²»ÔÚ¡°Äܲ»ÄÜÊÕ¼¯Êý¾Ý¡±£¬¶øÔÚ¡°Íⲿ´úÂëÊÇ·ñ»¹ÄÜÈÆ¹ýÖ»¶ÁÔ¼Êø¸Ä״̬¡±¡£¿´ÍêÏÂÃæÕâ×éʾÀýºÍ½á¹û£¬Äã¾ÍÄÜÅжÏʲôʱºò±ØÐëÓà asStateFlow()£¬ÒÔ¼°ËüΪʲôÊÇ״̬·â×°ÀïµÄ³£¹æÐ´·¨¡£
ʾÀý´úÂëÓëÔËÐнá¹û˵Ã÷ÁËʲô
ÏÈ¿´ÔʼʾÀý¡£ÕâÀï·Ö±ð¶¨ÒåÁËÁ½×é״̬£ºÒ»×éͨ¹ý _strList.asStateFlow() ±©Â¶£¬ÁíÒ»×éÔòÖ±½Ó°Ñ MutableStateFlow ¸³¸ø StateFlow ÀàÐͱäÁ¿¡£
private val _strList = MutableStateFlow>(listOf("A", "B", "C"))
val strList: StateFlow> = _strList.asStateFlow()
private val _str2List = MutableStateFlow>(listOf("X", "Y", "Z"))
val str2List: StateFlow> = _str2List
@Test
fun testAsStateFlow() = runTest {
launch {
strList.collect { println("strList ÊÕµ½ÐÂÖµ: $it") }
}
launch {
delay(500)
(strList as MutableStateFlow).value = listOf("A", "B", "C", "D")
}
launch {
str2List.collect { println("str2List ÊÕµ½ÐÂÖµ: $it") }
}
launch {
delay(500)
(str2List as MutableStateFlow).value = listOf("A", "X", "Y", "Z")
}
}
ÔËÐнá¹ûÈçÏ£º
strList ÊÕµ½ÐÂÖµ: [A, B, C]
str2List ÊÕµ½ÐÂÖµ: [X, Y, Z]
str2List ÊÕµ½ÐÂÖµ: [A, X, Y, Z]
½á¹ûºÜÖ±½Ó£º
strListËäÈ»ÄÜÕý³£ÊÕ¼¯£¬µ«Íⲿ°ÑËüǿת³ÉMutableStateFlowºó²¢Ã»ÓиÄÖµ³É¹¦¡£str2List±íÃæÀàÐÍͬÑùÊÇStateFlow£¬µ«ÒòΪËü±¾Ìå¾ÍÊÇMutableStateFlow£¬ËùÒÔǿתºó»¹ÄܼÌÐøÐ޸ġ£
Ò²¾ÍÊÇ˵£¬ÕâÁ½ÖÖд·¨ÔÚ¡°¶Á¡±Õâ¼þÊÂÉÏÃ»Çø±ð£¬µ«ÔÚ¡°ÊÇ·ñÕæµÄÖ»¶Á¡±Éϲî±ðºÜ´ó¡£
ÏÈ·ÖÇ壺MutableStateFlow ºÍ StateFlow ·Ö±ð¸ºÔðʲô
MutableStateFlow ºÍ StateFlow µÄ¹ØÏµ£¬¿ÉÒÔÀí½â³É¡°¿Éд״̬Դ¡±ºÍ¡°Ö»¶Á¹Û²ì¿Ú¡±¡£
MutableStateFlow£º¿É±ä״̬Á÷£¬¿ÉÒÔͨ¹ývalueÖ±½Ó¸Äµ±Ç°×´Ì¬¡£StateFlow£ºÖ»¶Á״̬Á÷£¬ÍⲿֻÄܶÁÈ¡ºÍcollect£¬²»ÄÜÖ±½ÓдÈë¡£
Òò´ËÔÚ³£¼û·â×°ÀÄÚ²¿»á±£ÁôÒ»¸ö˽ÓеĿÉд¶ÔÏ󣬶ÔÍâÖ»±©Â¶Ö»¶Á½Ó¿Ú£º
private val _strList = MutableStateFlow>(listOf("A", "B", "C"))
val strList: StateFlow> = _strList.asStateFlow()
ÕâÖÖд·¨µÄÖØµã²»ÊÇÓï·¨¸ü¡°±ê×¼¡±£¬¶øÊǰѡ°ËÄܸÄ״̬¡±Õâ¼þÊÂÃ÷È·ÏÞÖÆÔÚµ±Ç°ÀàÄÚ²¿¡£Íⲿģ¿é¡¢UI ²ã»òÕßµ÷Ó÷½Ö»Äܶ©ÔÄ״̬±ä»¯£¬²»ÄÜËæÊÖдÈ룬´Ó¶ø¼õÉÙ״̬À´Ô´Ê§¿ØµÄÎÊÌâ¡£
Ϊʲôֱ½Ó¸³Öµ²»¹»£ºÀàÐÍÖ»¶Á²»µÈÓÚ¶ÔÏóÖ»¶Á
ºÜ¶àÈËÀ§»óµÄºËÐľÍÔÚÕâÀ¼ÈÈ»ÒѾд³ÉÁË StateFlow ÀàÐÍ£¬ÎªÊ²Ã´»¹²»°²È«£¿

ÔÒòÊÇ£¬val str2List: StateFlow<...> = _str2List Ö»Êǰѡ°±äÁ¿±©Â¶³öÀ´µÄ¾²Ì¬ÀàÐÍ¡±ÉùÃ÷³ÉÁË StateFlow£¬²¢Ã»Óиıäµ×²ã¶ÔÏóÈÔÈ»ÊÇ MutableStateFlow Õâ¼þÊ¡£Ö»ÒªÍⲿÄõ½µÄÊÇͬһ¸öʵÀý£¬¾ÍÈÔÓлú»áͨ¹ýǿת°ÑËü¸Ä»Ø¿ÉдÀàÐÍ¡£
ʾÀýÀïµÄÕâ¶Î´úÂë¾ÍÊǵäÐÍÇé¿ö£º
(str2List as MutableStateFlow).value = listOf("A", "X", "Y", "Z")
´Ó½Ó¿ÚÉè¼Æ¿´£¬str2List ±¾Ó¦ÊÇÖ»¶Á״̬£»µ«´ÓÔËÐÐʱ¶ÔÏó¿´£¬ËüÒÀ¾ÉÊÇÄǸö¿ÉдµÄ MutableStateFlow¡£ÓÚÊÇÍⲿ´úÂëÈÔÄÜÐÞ¸ÄÖµ£¬·â×°¾Í±»ÈÆ¿ªÁË¡£
Ïà±È֮ϣ¬ÏÂÃæÕâ¶Î´úÂëËäÈ»ÐÎʽÏàËÆ£º
(strList as MutableStateFlow).value = listOf("A", "B", "C", "D")
ȴûÓÐÉúЧ£¬ÒòΪ asStateFlow() ·µ»ØµÄÊÇÖ»¶ÁÊÓͼ£¬ÍⲿÄõ½µÄÒѾ²»ÊÇÔʼµÄ¿Éд¶ÔÏó±¾Éí¡£»»¾ä»°Ëµ£¬asStateFlow() ²»Êǵ¥´¿ÎªÁË¡°¿´ÆðÀ´¸ü¹æ·¶¡±£¬¶øÊÇÔÚÔËÐÐʱҲ²¹ÉÏÁËÒ»²ãÕæÕýµÄÖ»¶Á¸ôÀë¡£
asStateFlow() µ½µ××öÁËʲô
asStateFlow() µÄ×÷Ó㬿ÉÒÔ¸ÅÀ¨ÎªÒ»¾ä»°£º°ÑÄÚ²¿¿Éд״̬°ü×°³É¶ÔÍâÖ»¶ÁµÄ¹«¿ª½Ó¿Ú¡£
val strList: StateFlow> = _strList.asStateFlow()
ÕâÑù×öÖ®ºó£¬Íⲿ´úÂëÈÔÈ»¿ÉÒÔ£º
- ¶ÁÈ¡µ±Ç°×´Ì¬
- ͨ¹ý
collect¶©Ôı仯
µ«²»ÄÜÔÙͨ¹ýÄõ½Í¬Ò»¸ö¿ÉдʵÀýµÄ·½Ê½È¥¸Ä value¡£Õâ´øÀ´µÄºÃ´¦ºÜÃ÷È·£º
- ״̬ÐÞ¸ÄÈë¿Ú¼¯ÖУ¬±ãÓÚÅŲé˸ÄÁËÊý¾Ý¡£
- ¼õÉÙÍⲿģ¿éԽȨдÈë´øÀ´µÄ¸±×÷Óá£
- Èà ViewModel »ò״̬³ÖÓÐÕßµÄÖ°Ôð¸üÇåÎú¡£
- ºóÐøÎ¬»¤Ê±£¬¸üÈÝÒ×½¨Á¢¡°×´Ì¬Ö»ÄÜ´ÓÄÚ²¿¸üС±µÄÒ»ÖÂÔ¼¶¨¡£
ËùÒÔÔÚÈÕ³£ÏîÄ¿Àï£¬ÍÆ¼öд·¨Í¨³£¶¼ÊÇ£º
private val _uiState = MutableStateFlow(...)
val uiState: StateFlow<...> = _uiState.asStateFlow()
ÕâÒѾ²»ÊÇ¿ÉÑ¡µÄ´úÂë·ç¸ñÎÊÌ⣬¶øÊÇ״̬·â×°ÊÇ·ñÍêÕûµÄÎÊÌâ¡£
½áÂÛÓëÑÓÉ죺asSharedFlow() Ò²ÊÇͬÑùÂß¼
»Øµ½×î³õµÄÎÊÌ⣬ΪʲôҪÓà .asStateFlow()£¬¶ø²»ÊÇÖ±½Ó¸³Öµ£¿´ð°¸ÊÇ£ºÖ±½Ó¸³ÖµÖ»ÏÞÖÆÁË¡°ÉùÃ÷³öÀ´µÄÀàÐÍ¡±£¬Ã»ÓÐÕæÕý¸ôÀëµ×²ã¿Éд¶ÔÏó£»asStateFlow() ²ÅÄܰÑÄÚ²¿¿É±ä״̬°²È«µØ×÷Ϊֻ¶Á״̬±©Â¶³öÈ¥¡£

¿ÉÒ԰ѽáÂÛѹËõ³ÉÈýµã£º
MutableStateFlow¸ºÔðдÈ룬StateFlow¸ºÔð¶ÔÍâ¶ÁÈ¡¡£val x: StateFlow = mutableFlowÈÔ¿ÉÄܱ©Â¶Í¬Ò»¸ö¿ÉдʵÀý¡£asStateFlow()ÄÜÈÃÍⲿֻÄܶÁ¡¢²»ÄܽèÖúǿתֱ½Ó¸ÄÖµ¡£
ͬÑùµÄ˼·ҲÊÊÓÃÓÚ SharedFlow¡£Èç¹ûÄãÔÚÄÚ²¿Ê¹ÓõÄÊÇ MutableSharedFlow£¬¶ÔÍⱩ¶ʱҲӦÓÅÏÈʹÓà asSharedFlow()£º
MutableSharedFlow ¿ÉÒÔͨ¹ý emit() ·¢ËÍʼþ£¬¶ø SharedFlow Ö»Ìṩ¶©ÔÄÄÜÁ¦¡£Ê¹Óà asSharedFlow() ºó£¬Íⲿ´úÂëÖ»ÄܽÓÊÕʼþ£¬²»ÄÜÔ½¹ý±ß½çÖ÷¶¯ÏòÁ÷Àï·¢ËÍÄÚÈÝ£¬ÕâÑùʼþÁ÷µÄÀ´Ô´»á¸üµ¥Ò»£¬Ò²¸üÈÝÒ×ά»¤¡£
Òò´Ë£¬ÎÞÂÛÊÇ״̬Á÷»¹ÊÇʼþÁ÷£¬ÍƼö×ö·¨¶¼ÊÇÒ»ÖµģºÄÚ²¿±£Áô MutableXxxFlow£¬Íⲿֻ±©Â¶ asXxxFlow() ºóµÄÖ»¶Á°æ±¾¡£







