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?
6 Réponses :
Remplacer Collect
par CollectLaSest
.
Collect et Collectlatest est différent
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.
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) } }
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 A> 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? @@
Ajouter ci-dessous l'importation:
import kotlinx.coroutines.flow.collect
Idée supprimant constamment cette importation comme non utilisée / optimisée. Sans ça, j'ai cette erreur de compilation
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>
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
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.
pre> xxx < / p>
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?