58
votes

La collecte de Kotlin Flow est-elle uniquement de l'API interne kotlinx.coroutines?

Prendre l'exemple direct de https://kotlinlang.org /docs/reference/coroutines/flow.html#flows-are-cold

    implementation "org.jetbrains.kotlin:kotlin-stdlib:1.4.2"
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2'
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1'
    testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.4.2'

J'ai obtenu l'erreur sur Collect .

xxx pre>

lorsque j'ajoute @internalcoroutinesapi

Type mismatch.
Required:
FlowCollector<Int>
Found:
([ERROR :  ]) → Unit
Cannot infer a type for this parameter. Please specify it explicitly.

J'obtiens une erreur dans le Collect code > Lambda (fonction de valeur -> println (valeur ) comme ci-dessous

@InternalCoroutinesApi
fun main() = runBlocking<Unit> {
    println("Calling simple function...")
    val flow = simple()
    println("Calling collect...")
    flow.collect { value -> println(value) }
    println("Calling collect again...")
    flow.collect { value -> println(value) }
}

J'utilise Kotlin version 1.4.21.

This is an internal kotlinx.coroutines API that should not be used from outside of kotlinx.coroutines. No compatibility guarantees are provided.It is recommended to report your use-case of internal API to kotlinx.coroutines issue tracker, so stable API could be provided instead

Ai-je fait quelque chose de mal à ne pas compiler l'exemple de code dans Android Studio?


3 commentaires

ajouter Importer kotlinx.coroutines.flow.collect


@quetzalcoatl, le titre a du sens, car apparemment Kotlin Collect n'est pas uniquement kotlinx.collection.api. C'est le message d'erreur qui induit en erreur en le faisant penser que c'est et descendre la mauvaise solution.


Hum ... intéressant. Merci de clarifier. Je me demande pourquoi cette "API Kotlinx.Coroutines interne qui ne devrait pas être utilisée de l'extérieur de Kotlinx.Coroutines." a été généré alors. Y a-t-il eu une autre fonction «Collect» qui était déjà disponible (mais pas en forme), ou cette erreur provenait-elle d'une chose totalement différente?


6 Réponses :


-4
votes

Remplacer Collect par CollectLaSest .


1 commentaires

Collect et Collectlatest est différent



98
votes

La réponse est, non, Collect n'est pas seulement l'API interne Kotlinx.Coroutines. Le message d'erreur est trompeur.

Selon le commentaire de @ IR42, Ajouter l'importation de Kotlinx.Coroutines.flow.Collect Résoudre le problème.

Informations supplémentaires, pourquoi je n'a pas choisi collectionLaSest car la réponse

Collect et Collectlatest est différente.

En utilisant cet exemple

I'm not blocked 1
I'm not blocked 2
1
I'm not blocked 3
2

Collect produira

fun simple(): Flow<Int> = flow { // flow builder
    for (i in 1..3) {
        delay(100) // pretend we are doing something useful here
        emit(i) // emit next value
    }
}

fun main() = runBlocking<Unit> {
    // Launch a concurrent coroutine to check if the main thread is blocked
    launch {
        for (k in 1..3) {
            println("I'm not blocked $k")
            delay(100)
        }
    }
    // Collect the flow
    simple().collectLatest { value -> println(value) } 
}

selon https://kotlinlang.org/docs/reference/coroutines/flow.html

mais CollectlaSest

I'm not blocked 1
1
I'm not blocked 2
2
I'm not blocked 3
3

produira

fun simple(): Flow<Int> = flow { // flow builder
    for (i in 1..3) {
        delay(100) // pretend we are doing something useful here
        emit(i) // emit next value
    }
}

fun main() = runBlocking<Unit> {
    // Launch a concurrent coroutine to check if the main thread is blocked
    launch {
        for (k in 1..3) {
            println("I'm not blocked $k")
            delay(100)
        }
    }
    // Collect the flow
    simple().collect { value -> println(value) } 
}


5 commentaires

L'importation ne fonctionne pas sur Kotlinx-Coroutines-Android: 1.6.0-RC2


@ DI0N0S Cela semble être un problème spécifique à 1.6.0-RC2. Voir ce numéro de numéro: github.com/kotlin/kotlinx.coroutines/issues/3078 Il a été corrigé github.com/kotlin/kotlinx.coroutines/pull/3082 < / a> donc je pense qu'il arrivera à la prochaine version. -> Utilisez 1.6.0-rc , sautez 1.6.0-rc2 et attendez la version suivante.


@ di0n0s version 1.6.0-rc3 a été publié et le problème existant dans 1.6.0-rc3 a été résolu. Il est mentionné dans les notes de publication: github.com/kotlin/ kotlinx.coroutines / releases / tag / 1.6.0-rc3


C'est toujours un problème si vous utilisez flow.flowwithlifecycle.collect () . J'ai dû passer à l'utilisation de RepeatonLifecycle à la place.


Comment se fait-il que ce message d'erreur trompeur apparaisse? @@



15
votes

Ajouter ci-dessous l'importation:

import kotlinx.coroutines.flow.collect


1 commentaires

Idée supprimant constamment cette importation comme non utilisée / optimisée. Sans ça, j'ai cette erreur de compilation



1
votes

Pour la version 1.6.0-rc3 et plus récent:

les annotations @internalcoroutinesapi ont été supprimées de toutes les fonctions collection () 3 ne verra plus l'erreur et n'aura plus besoin de l'importation

import kotlinx.coroutines.flow.collect

car (avec les modifications de un autre pr ) Nous pouvons maintenant utiliser directement le collection () fonction membre.

p>


0 commentaires

0
votes

L'API a changé dans les versions plus récentes de Kotlinx Coroutines et au lieu d'un lambda dans la fonction de collecte, il devrait passer comme l'appel final de la chaîne. L'exemple de documentation:

flow
  .onEach { value -> process(value) }
  .catch { e -> handleException(e) }
  .collect() // trigger collection of the flow


0 commentaires

0
votes

J'ai finalement trouvé la solution pour cela après que cela m'a presque rendu fou. Comme aucune des solutions ici n'a fonctionné pour moi, j'avais un cas spécial où je travaillais sur un projet multi-modules et Collect () a continué à jeter cette erreur partout et même à l'importation manuelle ne l'a pas répandue.

Résolution du problème pour moi est explicitement ajouté de la dépendance aux coroutines à tous les modules de mon projet build.grads fichiers, pas seulement celui de l'application, même les modules qui n'utilisent pas les coroutines.

xxx < / p>

0 commentaires