--- id: externalComponent title: External Component sidebar_label: External Component --- The ExternalComponent layout allows you to display any native view as a screen. To use the External Component we'll need to register it with a string name. This name is then used when declaring layouts in JS. ## Android ### Implementing the native component When it comes to implementing an external component on Android, you have two choices. We recommend you use a base class extending `View`. If you're required to use Fragments, you'll find an basic example below. #### ViewGroup ```java public class ViewGroupComponent implements ExternalComponent { private final FrameLayout content; ViewGroupComponent(FragmentActivity activity, JSONObject props) { content = new FrameLayout(activity); } @Override public View asView() { return content; } } ``` #### Fragment Using a Fragment as an external component is done by attaching the Fragment to a FrameLayout, and returning the FrameLayout from the `asView()` method of the ExternalComponent. ```java public class FragmentComponent implements ExternalComponent { private final FrameLayout content; FragmentComponent(FragmentActivity activity, JSONObject props) { // Create the FrameLayout to which we'll attach our Fragment to content = new FrameLayout(activity); content.setId(R.id.fragment_screen_content); // Attach the Fragment to the FrameLayout activity.getSupportFragmentManager() .beginTransaction() .add(R.id.fragment_screen_content, createFragment(props)) .commitAllowingStateLoss(); } private FragmentScreen createFragment(JSONObject props) { FragmentScreen fragment = new FragmentScreen(); // Pass the props sent from Js in a bundle Bundle args = new Bundle(); args.putString("text", props.optString("text", "")); fragment.setArguments(args); return fragment; } @Override public View asView() { return content; } } ``` ### Registering the component ```java public class MainApplication extends NavigationApplication { @Override public void onCreate() { super.onCreate(); registerExternalComponent("MyExternalComponent", new FragmentCreator()); } } ``` ## iOS ### ViewController registration ```objectivec [ReactNativeNavigation registerExternalComponent:@"MyExternalComponent" callback:^UIViewController *(NSDictionary *props, RCTBridge *bridge) { return [[ExternalViewController alloc] initWithProps:props]; }]; ``` ## Using the component from JS Once you've registered the external component in native, you can use it in your layout declarations. For example, to show an external component modally: ```js Navigation.showModal({ externalComponent: { name: 'MyExternalComponent', passProps: { text: "Text from JS" } } }); ``` :::caution props passed to external components are sent over the bridge and therefore must be serializable. :::