Over the past 8 years, I've had a ton of success building and shipping mobile applications, for both iOS and Android, using React Native. As an early-adopter of React on the web, I was thrilled with how much of my knowledge and skillset transferred and how straightforward it was to build an app with React Native. I'm a big fan of the primitives that the React Native library provides– it gives you everything you need to build any UI element that you could imagine and then have it render consistently on iOS, Android, and the web!
Cross-platform UI
I'm a huge proponent of cross-platform development– the ability to design and develop an interface that can be written one time and then rendered on a number of different platforms is phenomenal. I have significant experience build React Native UI components that are able to be rendered on mobile or web. A demo of the library I helped build is available to browse at [SmartKit.dev]. (unfortunately the library itself is closed-source)
Layers
I believe building strong mobile applications requires you to have a solid understanding of the different layers that make up your application and the libraries and patterns you establish in order to maintain consistency throughout your app.
For example, a React Native application at it's core is powered by a navigation library, and the most common and powerful library is [React-Navigation]. Under-the-hood, react-navigation uses [react-native-screens], [react-native-reanimated], [react-native-gesture-handler], and a handful of other powerful libraries to deliver a native navigation experience that can be controlled and customized via React Native components. It's so so so good.
On the data-fetching layer– using a state-management library like [React Query] gives you everything you need to manage, cache, and render data. When paired with react-navigation, you are able to establish consistent patterns around authentication and sending/receiving data from a server.
For UI components, I prefer using the existing React-Native primitives to build and style custom components. Every good design system and app starts with a Button component, then you need
App Variants and CI/CD
In order to have multiple variants of an app installed on your phone, you have to split your iOS app into separate build targets and your Android app into separate build flavors. When working on a large team or application, you might find yourself with a 4-5 app variants– Production, Staging, QA, and development variants of the application all installed on your phone side-by-side.
For large teams, it can be helpful to also add a PR variant of your application. These builds run on each individual pull request made in the repo, generating a unique build for testing that PR. This can help lower the burden of review for team members– rather than needing to check out a branch and build it locally to test and review a PR– they can install the PR App Variant with a specific build on their phone.