Reputation: 304
I'm developing an Android library,
When the user receives a push notification it may contain deep links, that I need to return to the app.
I did in kotlin with no problem.
This is the function that is called when it needs to send the deep links
fun getDeepLinkFlow(): Flow<HashMap<String, String>?> = flow {
emit(deepLinks)
}
And in my kotlin test app I managed to use with no problems as well, using like this.
GlobalScope.launch(coroutineContext) {
SDK.getDeepLinkFlow().collect { deepLinks ->
println(deepLinks)
}
}
But now, there's a RN project that whant to use the lib, in order to do that we are doing a RN module that joins the iOS code and the Android code. But it uses java.
So, how can I use the collect from Coroutines on a Java code? or what could I do differently?
Upvotes: 7
Views: 8099
Reputation: 1061
As an alternative, if you're handling it on an activity or fragment a way to do this is using an extension function with a callback. Here's an example:
Kotlin extension:
fun MyActivity.observeScreenState(callbackToJava: (ScreenState) -> Unit) {
lifecycleScope.launch {
viewModel.screenState.collect {
callbackToJava(it)
}
}
}
Java code:
observeScreenState(
this,
(ScreenState state) -> {
doWhatever(state);
return null;
}
);
Upvotes: 1
Reputation: 304
I've decided to change the way deep links were used and start using the ViewModel with a liveData instead.
Upvotes: 1
Reputation: 25603
Coroutines/Flow
is inherently awkward to use from Java since it relies on transformed suspend
code to work.
One possible solution is to expose an alternative way of consuming the Flow
to your java code. Using the RxJava integration library you can expose a compatible Flowable
that the java side can consume.
Upvotes: 1