λÖãºÊ×Ò³ > Kotlin > ÎªÊ²Ã´ÒªÊ¹Óà asStateFlow()£¬¶ø²»ÊÇÖ±½Ó¸³Öµ£¿

ΪʲôҪʹÓà asStateFlow()£¬¶ø²»ÊÇÖ±½Ó¸³Öµ£¿

ʱ¼ä£º2026-08-25  |  ×÷Õߣº星际追番人  |  ÔĶÁ£º0

Ŀ¼

  1. ʾÀý´úÂëÓëÔËÐнá¹û˵Ã÷ÁËʲô
  2. ÏÈ·ÖÇ壺MutableStateFlow ºÍ StateFlow ·Ö±ð¸ºÔðʲô
  3. Ϊʲôֱ½Ó¸³Öµ²»¹»£ºÀàÐÍÖ»¶Á²»µÈÓÚ¶ÔÏóÖ»¶Á
  4. asStateFlow() µ½µ××öÁËʲô
  5. ½áÂÛÓëÑÓÉ죺asSharedFlow() Ò²ÊÇͬÑùÂß¼­

ǰÑÔ

ºÜ¶à Kotlin ¿ª·¢ÕßµÚÒ»´Î¿´µ½ val strList: StateFlow<...> = _strList ºÍ val strList: StateFlow<...> = _strList.asStateFlow() ʱ£¬¶¼»á¾õµÃÁ½Õß¼ÈÈ»¶¼ÄÜÅÜͨ£¬ÎªÊ²Ã´»¹Òª¶àдһ²½¡£ÕæÕýµÄ²î±ð²»ÔÚ¡°Äܲ»ÄÜÊÕ¼¯Êý¾Ý¡±£¬¶øÔÚ¡°Íⲿ´úÂëÊÇ·ñ»¹ÄÜÈÆ¹ýÖ»¶ÁÔ¼Êø¸Ä״̬¡±¡£¿´ÍêÏÂÃæÕâ×éʾÀýºÍ½á¹û£¬Äã¾ÍÄÜÅжÏʲôʱºò±ØÐëÓà asStateFlow()£¬ÒÔ¼°ËüΪʲôÊÇ״̬·â×°ÀïµÄ³£¹æÐ´·¨¡£

ºÜ¶à 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 ÀàÐÍ£¬ÎªÊ²Ã´»¹²»°²È«£¿

¶Ô±È asStateFlow ÓëÖ±½Ó¸³Öµºó£¬ÍⲿÊÇ·ñ»¹ÄÜǿתÐ޸ĵײã״̬Á÷
Ö±½Ó¸³ÖµÓë asStateFlow() µÄ·âͬÑùÉùÃ÷Ϊ StateFlow£¬Ö±½Ó¸³ÖµÓë asStateFlow()¡£

Ô­ÒòÊÇ£¬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() ²ÅÄܰÑÄÚ²¿¿É±ä״̬°²È«µØ×÷Ϊֻ¶Á״̬±©Â¶³öÈ¥¡£

StateFlow Óë SharedFlow µÄ¶ÔÍⱩ¶·½Ê½¶ÔÕÕͼ
StateFlow Óë SharedFlow״̬Á÷ºÍʼþÁ÷µÄ·â×°Ô­ÔòÏàͬ£ºÄÚ²¿¿Éд£¬¶ÔÍâÖ»¶Á¡£

¿ÉÒ԰ѽáÂÛѹËõ³ÉÈýµã£º

  • MutableStateFlow ¸ºÔðдÈ룬StateFlow ¸ºÔð¶ÔÍâ¶ÁÈ¡¡£
  • val x: StateFlow = mutableFlow ÈÔ¿ÉÄܱ©Â¶Í¬Ò»¸ö¿ÉдʵÀý¡£
  • asStateFlow() ÄÜÈÃÍⲿֻÄܶÁ¡¢²»ÄܽèÖúǿתֱ½Ó¸ÄÖµ¡£

ͬÑùµÄ˼·ҲÊÊÓÃÓÚ SharedFlow¡£Èç¹ûÄãÔÚÄÚ²¿Ê¹ÓõÄÊÇ MutableSharedFlow£¬¶ÔÍⱩ¶ʱҲӦÓÅÏÈʹÓà asSharedFlow()£º

MutableSharedFlow ¿ÉÒÔͨ¹ý emit() ·¢ËÍʼþ£¬¶ø SharedFlow Ö»Ìṩ¶©ÔÄÄÜÁ¦¡£Ê¹Óà asSharedFlow() ºó£¬Íⲿ´úÂëÖ»ÄܽÓÊÕʼþ£¬²»ÄÜÔ½¹ý±ß½çÖ÷¶¯ÏòÁ÷Àï·¢ËÍÄÚÈÝ£¬ÕâÑùʼþÁ÷µÄÀ´Ô´»á¸üµ¥Ò»£¬Ò²¸üÈÝÒ×ά»¤¡£

Òò´Ë£¬ÎÞÂÛÊÇ״̬Á÷»¹ÊÇʼþÁ÷£¬ÍƼö×ö·¨¶¼ÊÇÒ»ÖµģºÄÚ²¿±£Áô MutableXxxFlow£¬Íⲿֻ±©Â¶ asXxxFlow() ºóµÄÖ»¶Á°æ±¾¡£

ÃâÔðÉùÃ÷£ºÎÄÖÐͼÎľùÀ´×ÔÍøÂ磬ÈçÓÐÇÖȨÇëÁªÏµÉ¾³ý£¬ÐÄÔ¸ÓÎÏ··¢²¼´ËÎĽöΪ´«µÝÐÅÏ¢£¬²»´ú±íÐÄÔ¸ÓÎÏ·ÈÏͬÆä¹Ûµã»ò֤ʵÆäÃèÊö¡£

Ïà¹ØÎÄÕÂ

¸ü¶à

¾«Ñ¡ºÏ¼¯

¸ü¶à

´ó¼Ò¶¼ÔÚÍæ

ÈÈÃÅ»°Ìâ

´ó¼Ò¶¼ÔÚ¿´

¸ü¶à