How to use registerForActivityResult with TurboModules in react native's new architecture?

637 Views Asked by At

Firstly I am not talking about the old architecture and I have already gone through this

This method does not really works for new architecture given how the files are structured

registerForActivityResult can only be used in MainActivity. I need registerForActivityResult for my intent to pick images.

Here is the complete code sample

The issue is I can't call my MainActivity in my Module as the Module file is not part of the main android folder but a separate folder called RTNImagePicker in my case

I get below error if I try to refer MainActivity in my module

enter image description here

enter image description here

I cannot add it as dependency on module as well as it results in circular dependency

enter image description here

2

There are 2 best solutions below

1
On

You will need to have a gateway module. A gateway module would act as a buffer between the two modules and take care of any dependency related issue

eg

interface MainActivityFinder {
    fun homeScreenIntent(context: Context): Intent
}

Now use this interface as means to pass the data from one activity to another using registerForActivityResult after adding this gateway module as a dependency in your project.

4
On

Hope this helps you:

  • Creating a new interface where has 'pickImage' virtual function.
  • Let MainActivity implement the new interface and define 'pickImage' function entity.
  • In RTNImagePicker, importing the new interface instead of MainActivity.
  • Cast context as the new interface to call 'pickImage' function.

MainActivity:

interface NewInterface {
 func pickImage(i: Intent)
}
class MainActivity : ReactActivity(), NewInterface {
 ...
 override func pickImage(intent: Intent) {
  resultLauncher.launch(intent)
 }
 ...
}

RTNImagePicker:

override fun picImage(promise?: Promise) {
 ...
 val activity = context?.currentActivity as NewInterface
 activity.picImage(intent)
}