Kotlin-MutableStateFlowEmmisionが受信されることはありません

DeveloperKurt

GameDataのisInFavoritesプロパティを別のフラグメントで変更すると、変更がリポジトリのリスナーで受信されていることがわかりますが、フラグメントに戻ると、MutableStateFlowを使用したときにビューモデルが更新された値を受信しません。

不思議なことに、フローをMutableSharedFlowに変更すると、突然のビューモデルもすべて更新された値を取得し始めます。なぜこれが起こっているのか誰かが知っていますか?ここでMutableStateFlowを使用する必要がありますが、機能していません。

リポジトリ:

private val gameDataListResultMutableFlow: MutableStateFlow<Result<List<GameData>>> = MutableStateFlow(Result.Loading)



    override suspend fun observeGameDataList(): Flow<Result<List<GameData>>>
        {
   

      CoroutineScope(Dispatchers.IO + coroutineContext).launch {
                localGameDataSource.observeGameDataList().collectLatest{
                     if(it is Result.Success)
                     {
                        Timber.d("local data change favorite value of item 0: ${it.data[0].isInFavorites}")
                     }
               
                    gameDataListResultMutableFlow.emit(it)
                }
            }
    }

ビューモデル

private suspend fun observeGameListResult()
{

    gameRepository.observeGameDataList().collect{

        if(it is Result.Success)
            Timber.d("data change received in viewmodel value of item 0: ${it.data[0].isInFavorites}")

        gameListResultMutableLiveData.postValue(it)
    }
}


fun getGameListResultLiveData(): LiveData<Result<List<GameData>>>
{
    launch(coroutineContext) {
        observeGameListResult()
    }

    return gameListResultMutableLiveData
}

StateFlow使用時のログ

LOADING THE INITIAL STATE, ISFAVORITE VALUE IS TRUE

D/DefaultGameRepository: local data change favorite value of item 0: true
D/GameListViewModel: data change received in viewmodel value of item 0: true



SWITCHING TO ANOTHER FRAGMENT TO CHANGE THE ISFAVORITE'S VALUE TO FALSE, WHICH IS RECEIVED ONLY BY 
THE LOCAL SOURCE LISTENER

D/DefaultGameRepository: local data change the favorite value of item 0: false



SWITCHING BACK TO THE INITIAL FRAGMENT AND THE UPDATED VALUE OF THE ISFAVORITE REFLECTED ON THE LOCAL SOURCE LISTENER BUT NOT ON THE VIEWMODEL LISTENER---

D/GameListViewModel: data change received in viewmodel value of item 0: true
D/DefaultGameRepository: local data change the favorite value of item 0: false

SharedFlow使用時のログ:

LOADING THE INITIAL STATE, ISFAVORITE VALUE IS TRUE

D/DefaultGameRepository: local data change the favorite value of item 0: true
D/GameListViewModel: data change received in viewmodel value of item 0: true
    

SWITCHING TO ANOTHER FRAGMENT TO CHANGE THE ISFAVORITE'S VALUE TO FALSE, WHICH IS RECEIVED BY LOCAL 
SOURCE AND THE VIEWMODEL LISTENER
        
D/DefaultGameRepository: local data change the favorite value of item 0: false
D/GameListViewModel: data change received in viewmodel value of item 0: false
    

SWITCHING BACK TO THE INITIAL FRAGMENT AND THE UPDATED VALUE OF THE ISFAVORITE REFLECTED ON THE 
VIEWMODEL   
 
D/DefaultGameRepository: local data change the favorite value of item 0: false
D/GameListViewModel: data change received in viewmodel value of item 0: false
D/GameListViewModel: data change received in viewmodel value of item 0: false
ジェレミー・ジャオ

はい、おそらく主な理由は、放出される提案されたオブジェクトが古い値と等しくない限り、MutableStateFlowが放出されないことです。ただし、MutableSharedFlowは、その放出ロジックにdistinctUntilChanged()同等のロジックがないため、常に放出します。

SharedFlowのドキュメントから:

強い平等に基づく対立

状態フローの値は、distinctUntilChanged演算子と同様の方法で、Any.equals比較を使用して統合されます。これは、受信した更新をMutableStateFlowの値に統合し、新しい値が以前に発行された値と等しい場合にコレクターへの値の発行を抑制するために使用されます。Any.equalsのコントラクトに違反するクラスでの状態フローの動作は指定されていません。

https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-state-flow/index.html

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Kotlin、Micronaut、HibernateのカスタムBeanValidatorが呼び出されることはありません

分類Dev

KotlinのsuspendCoroutineにいるとき、AndroidNetworkingが戻ることはありません

分類Dev

予期される型はJavaではnullを受け入れませんが、Kotlinでは値がnullになる可能性があります

分類Dev

Kotlin関数は必要ありませんが、別のタイプとして定義されています

分類Dev

Androidのkotlin Google Playの課金は何も上書きonPurchasesUpdatedないか、使用されることはありません

分類Dev

SUPPLICANT_CONNECTION_CHANGE_ACTIONが受信されたことはありません

分類Dev

Kotlinの例外がすべてcrashlyticsに表示されるわけではありません

分類Dev

APIは@PostMappingでは情報を受信しませんが、@ RequestMappingでは受信します。Spring Boot、Kotlin、REST API

分類Dev

Kotlin: 'この型にはコンストラクターがあるため、ここで初期化する必要があります'が、コンストラクターは宣言されていません

分類Dev

DataBindingとLiveData:2つの実装(KotlinとJava)であり、Javaimplを機能させることはできません

分類Dev

JavaのCollections.synchronizedListのKotlin相当はありますか?それともこのKotlinでは必要ありません

分類Dev

KotlinでgenerateSequenceを使用するこの素数母関数は、理解するのが簡単ではありません。:(

分類Dev

IntelliJ IDEA:Kotlinがありません

分類Dev

これはKotlinのバグですか、それとも何かが足りませんか?

分類Dev

「配列アクセスを提供するsetメソッドがありません」-Kotlinでこれが発生するのはなぜですか?

分類Dev

ラムダまたはKotlinからの戻り:「戻り」はここでは許可されていません

分類Dev

ラムダまたはKotlinからの戻り:「戻り」はここでは許可されていません

分類Dev

ラムダまたはKotlinからの戻り:「戻り」はここでは許可されていません

分類Dev

Kotlin forEachは、REPLで実行するとCTL-Cまで実行されないことがありますか?

分類Dev

GradleプロジェクトでJavaとKotlinを混在させると、KotlinはJavaクラスを見つけることができません

分類Dev

Android Bluetoothはペアリングされ、接続されますが、TextViewにデータを受信することはありません

分類Dev

kotlin.jvm.KotlinReflectionNotSupportedError:実行時にKotlinリフレクションの実装が見つかりません。kotlin-reflect.jarがあることを確認してください

分類Dev

投稿されたカスタムメッセージがフォームで受信されることはありません

分類Dev

Android StudioはKotlin依存関係を見つけることができません

分類Dev

kotlin intProgressionが繰り返されていませんか?

分類Dev

参照されているクラスkotlin.KotlinPackageが見つかりません

分類Dev

AndroidStudioでKotlin変数を見ることができません

分類Dev

ドキュメントに記載されているように、kotlin1.2にはkotlin.Mathクラスはありません

分類Dev

KotlinのRunnableSAM内に戻ることはできませんか?

Related 関連記事

  1. 1

    Kotlin、Micronaut、HibernateのカスタムBeanValidatorが呼び出されることはありません

  2. 2

    KotlinのsuspendCoroutineにいるとき、AndroidNetworkingが戻ることはありません

  3. 3

    予期される型はJavaではnullを受け入れませんが、Kotlinでは値がnullになる可能性があります

  4. 4

    Kotlin関数は必要ありませんが、別のタイプとして定義されています

  5. 5

    Androidのkotlin Google Playの課金は何も上書きonPurchasesUpdatedないか、使用されることはありません

  6. 6

    SUPPLICANT_CONNECTION_CHANGE_ACTIONが受信されたことはありません

  7. 7

    Kotlinの例外がすべてcrashlyticsに表示されるわけではありません

  8. 8

    APIは@PostMappingでは情報を受信しませんが、@ RequestMappingでは受信します。Spring Boot、Kotlin、REST API

  9. 9

    Kotlin: 'この型にはコンストラクターがあるため、ここで初期化する必要があります'が、コンストラクターは宣言されていません

  10. 10

    DataBindingとLiveData:2つの実装(KotlinとJava)であり、Javaimplを機能させることはできません

  11. 11

    JavaのCollections.synchronizedListのKotlin相当はありますか?それともこのKotlinでは必要ありません

  12. 12

    KotlinでgenerateSequenceを使用するこの素数母関数は、理解するのが簡単ではありません。:(

  13. 13

    IntelliJ IDEA:Kotlinがありません

  14. 14

    これはKotlinのバグですか、それとも何かが足りませんか?

  15. 15

    「配列アクセスを提供するsetメソッドがありません」-Kotlinでこれが発生するのはなぜですか?

  16. 16

    ラムダまたはKotlinからの戻り:「戻り」はここでは許可されていません

  17. 17

    ラムダまたはKotlinからの戻り:「戻り」はここでは許可されていません

  18. 18

    ラムダまたはKotlinからの戻り:「戻り」はここでは許可されていません

  19. 19

    Kotlin forEachは、REPLで実行するとCTL-Cまで実行されないことがありますか?

  20. 20

    GradleプロジェクトでJavaとKotlinを混在させると、KotlinはJavaクラスを見つけることができません

  21. 21

    Android Bluetoothはペアリングされ、接続されますが、TextViewにデータを受信することはありません

  22. 22

    kotlin.jvm.KotlinReflectionNotSupportedError:実行時にKotlinリフレクションの実装が見つかりません。kotlin-reflect.jarがあることを確認してください

  23. 23

    投稿されたカスタムメッセージがフォームで受信されることはありません

  24. 24

    Android StudioはKotlin依存関係を見つけることができません

  25. 25

    kotlin intProgressionが繰り返されていませんか?

  26. 26

    参照されているクラスkotlin.KotlinPackageが見つかりません

  27. 27

    AndroidStudioでKotlin変数を見ることができません

  28. 28

    ドキュメントに記載されているように、kotlin1.2にはkotlin.Mathクラスはありません

  29. 29

    KotlinのRunnableSAM内に戻ることはできませんか?

ホットタグ

アーカイブ