Anshulupadhyay03
03/23/2024, 2:19 PMprivate fun onMovieSelected(movieId: Int) {
println("item onMovieSelected-$movieId")
navigation.push(Configuration.Details(movieId), onComplete = {
println("Ansh: isMovieSelected ")
})
}
main class for iOS
fun MainViewController(lifecycle: LifecycleRegistry) = ComposeUIViewController {
CompositionLocalProvider{
val root = MovieBuffRootImpl(DefaultComponentContext(lifecycle = lifecycle))
App(root)
}
}
MovieBuffRootImpl :
https://pastebin.com/rTBU8ZaxArkadii Ivanov
03/23/2024, 2:34 PMAnshulupadhyay03
03/23/2024, 2:51 PMArkadii Ivanov
03/23/2024, 2:59 PMAnshulupadhyay03
03/23/2024, 3:06 PMArkadii Ivanov
03/23/2024, 3:11 PMArkadii Ivanov
03/29/2024, 10:19 PMAnshulupadhyay03
03/30/2024, 1:24 PMfun MainViewController(lifecycle: LifecycleRegistry) = ComposeUIViewController{
val root = MovieBuffRootImpl(DefaultComponentContext(lifecycle = LifecycleRegistry()))
App(root)
}
This is the ios code where I was passing lifecycle instance
struct ComposeView: UIViewControllerRepresentable {
private var lifeCycleHolder:LifeCycleHolder {LifeCycleHolder()}
func makeUIViewController(context: Context) -> UIViewController {
Main_iosKt.MainViewController(lifecycle:lifeCycleHolder.lifecycle)
}
func updateUIViewController(_ uiViewController: UIViewController, context: Context) {}
}
struct ContentView: View {
var body: some View {
ComposeView()
.ignoresSafeArea(.keyboard) // Compose has own keyboard handler
}
}
and here it is the LifecycleHolder class
class LifeCycleHolder : ObservableObject {
let lifecycle:LifecycleRegistry
init(){
lifecycle = LifecycleRegistryKt.LifecycleRegistry()
lifecycle.onCreate()
}
deinit {
lifecycle.onDestroy()
}
}
Arkadii Ivanov
03/30/2024, 2:45 PMMainViewController
function appears to be incorrect as well. You shouldn't call MovieBuffRootImpl(DefaultComponentContext(lifecycle = LifecycleRegistry()))
inside a Composable function, as explained in the docs. Keep in mind that ComposeUIViewController {}
lambda block is Composable. You can do something like this:
fun MainViewController(lifecycle: Lifecycle): UIViewController {
val root = MovieBuffRootImpl(DefaultComponentContext(lifecycle = lifecycle))
return ComposeUIViewController { App(root) }
}
Anshulupadhyay03
03/30/2024, 4:04 PMLifecycleRegistry()
instead of lifecycle passed from my iOS lifecycle MainViewController(lifecycle: Lifecycle)
and I am clueless what was the problem as earlier same code was working fine for older versions of decompose.
This is the code that works
fun MainViewController(): UIViewController {
val root = MovieBuffRootImpl(DefaultComponentContext(lifecycle = LifecycleRegistry()))
return ComposeUIViewController {
App(root)
}
}
Arkadii Ivanov
03/30/2024, 4:08 PMAnshulupadhyay03
03/30/2024, 5:17 PMArkadii Ivanov
03/30/2024, 10:31 PMApplicationLifecycle
instead: https://arkivanov.github.io/Decompose/getting-started/quick-start/#ios-with-swiftui-with-the-experimental-applicationlifecycleAnshulupadhyay03
03/31/2024, 10:12 AMArkadii Ivanov
03/31/2024, 10:21 AMUIApplicationDelegate
as described here. Or just use the new ApplicationLifecycle
, as it should work perfectly fine for your use case (one component hierarchy for the entire app).Anshulupadhyay03
03/31/2024, 10:24 AM