Debbie Clay

Debbie Clay


How to build Mobile Apps with React Hooks

In this React Native tutorial, we will build Mobile Apps with React Hooks. This tutorial can be a starting point to learn React Native from scratch with the new React Hooks. We are just not creating the legendary Hello World Mobile App. More than that, we will build simple Mobile apps that display a list of data, show data details and show Google maps. So, you will learn how to access local data, basic React Native routing, React Native basic components, and displaying Google Maps.

Table of Contents:

  • Install React Native CLI and Create App
  • Add React Navigation Header and Screens
  • Display List of Data
  • Show Data Details
  • Display Google Maps
  • Run and Test the React Native Mobile Apps

The following tools, frameworks, and modules are required for this tutorial:

  1. React Native
  2. Node.js (NPM or Yarn)
  3. React Native Elements
  4. React Native Maps
  5. Android Studio or SDK for Android
  6. XCode for iOS
  7. Terminal (OSX/Linux) or Command Line (Windows)
  8. Text Editor or IDE (We are using VSCode)

Before start to the main steps, make sure that you have installed Node.js and can run NPM or Yarn in the terminal or command line. To check the existing or installed Node.js environment open the terminal/command line then type this command.

node -v
npm -v
yarn -v

Install React Native CLI and Create App

For this React Native tutorial, we will use React Native CLI to create a React Native app. To install it, type this command in your App projects folder.

sudo npm install -g react-native-cli

Then create a React Native App using this command from your project directory.

react-native init ReactNativeTutorial

Next, go to the newly created React App folder and run the React Native app to the iOS simulator.

cd ReactNativeTutorial && npx react-native run-ios

Or run to the Android device/emulator.

cd ReactNativeTutorial && npx react-native run-android

When a new terminal window opened, go to the React Native project folder then run the Metro bundler server.

cd ~/Apps/ReactNativeTutorial && yarn start

Now, you will see this in the iOS simulator.

React Native Tutorial: Building Mobile Apps with React Hooks - Welcome

Add React Navigation Header and Screens

As we mention in the beginning, we will use a few screens for this React Native tutorial. For that, we need to add the components for each screen. Type these commands in the Terminal or Command line to add a folder and the components.

mkdir components
touch components/ListScreen.js
touch components/DetailsScreen.js
touch components/MapsScreen.js

That component files still the blanks Javascript file. We need to make it as the React Hooks main function files. Here’s the basic ListScreen.js look like.

import React, { useState, useEffect } from 'react';
import { Button, View, Text } from 'react-native';

export default function ListScreen({ navigation }) {

    return (
        <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>

ListScreen.navigationOptions = ({ navigation }) => ({
    title: 'List',

Here’s the DetailsScreen.js look like.

import React, { useState, useEffect } from 'react';
import { Button, View, Text } from 'react-native';

export default function DetailsScreen({ navigation }) {

    return (
        <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>

DetailsScreen.navigationOptions = ({ navigation }) => ({
    title: 'Details',

Here’s the MapsScreen.js look like.

import React, { useState, useEffect } from 'react';
import { Button, View, Text } from 'react-native';

export default function MapsScreen({ navigation }) {

    return (
        <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>

MapsScreen.navigationOptions = ({ navigation }) => ({
    title: 'Maps',

Next, we will add the Navigation header in the screen layout for this Mobile Apps. For that, add the libraries of React Navigation and React Native Gesture Handler by type these commands.

yarn add react-navigation
yarn add react-native-gesture-handler

For iOS, go to the ios folder then install Pod.

cd ios
pod install

Next, we will implement stack navigation in the current App.js. Open and edit App.js then add these imports of react-navigation createAppContainer, react-navigation-stack createStackNavigator, ListScreen, DetailsScreen, and MapsScreen.

import { createAppContainer } from 'react-navigation';
import { createStackNavigator } from 'react-navigation-stack';
import ListScreen from './components/ListScreen';
import DetailsScreen from './components/DetailsScreen';
import MapsScreen from './components/MapsScreen';

Add a constant variable after the imports that initialize createStackNavigator.

const RootStack = createStackNavigator(
    List: ListScreen,
    Details: DetailsScreen,
    Maps: MapsScreen,
    initialRouteName: 'List',
    defaultNavigationOptions: {
      headerStyle: {
        backgroundColor: '#19AC52',
      headerTintColor: '#fff',
      headerTitleStyle: {
        fontWeight: 'bold',

Add the above createStackNavigator to the createAppContainer.

const RootContainer = createAppContainer(RootStack);

Replace the current main function and the export with this export function.

export default function App() {
  return (
    <RootContainer />

Display List of Data

We will use the array of objects data dan get from the Javascript file. For that, create a new Javascript file in the root of the project folder.

touch Team.js

Open and edit that file then add these lines of the array.

export const Team = [
  { id: 1, name: 'Arsenal',    image: require('./img/arsenal.png'), location: 'London (Holloway)', stadium:    'Emirates Stadium',
  capacity:    60704, manager: 'Unai Emery', captain: 'Pierre-Emerick Aubameyang', lat: 51.554929, lng: -0.108449 },
  { id: 2, name: 'Aston Villa',    image: require('./img/aston-villa.png'), location:    'Birmingham', stadium: 'Villa Park',
  capacity: 42785, manager: 'Dean Smith', captain: 'Jack Grealish', lat: 52.509131, lng: -1.884767 },
  { id: 3, name: 'Bournemouth',    image: require('./img/bornemouth.png'),    location:    'Bournemouth', stadium:    'Dean Court',
  capacity: 11364, manager: 'Eddie Howe', captain: 'Simon Francis', lat: 50.735278, lng: -1.838290 },
  { id: 4, name: 'Brighton & Hove Albion',    image: require('./img/brighton.png'), location: 'Brighton', stadium:    'Falmer Stadium',
  capacity: 30666, manager: 'Graham Potter', captain: 'Lewis Dunk', lat: 50.861606, lng: -0.083716 },
  { id: 5, name: 'Burnley',    image: require('./img/burnley.png'),    location:    'Burnley', stadium:    'Turf Moor',
  capacity: 21944, manager: 'Sean Dyche', captain: 'Ben Mee', lat: 53.789017, lng: -2.230187 },
  { id: 6, name: 'Chelsea',    image: require('./img/chelsea.png'),    location:    'London (Fulham)', stadium:    'Stamford Bridge',
  capacity: 41631, manager: 'Frank Lampard', captain: 'César Azpilicueta', lat: 51.481696, lng: -0.190957 },
  { id: 7, name: 'Crystal Palace',    image: require('./img/crystal-palace.png'), location: 'London (Selhurst)', stadium: 'Selhurst Park',
  capacity: 26047, manager: 'Roy Hodgson', captain: 'Luka Milivojević', lat: 51.398281, lng: -0.085489 },
  { id: 8, name: 'Everton',    image: require('./img/everton.png'),    location:    'Liverpool (Walton)', stadium: 'Goodison Park',
  capacity: 39221, manager: 'Marco Silva', captain: 'Séamus Coleman', lat: 53.438813, lng: -2.966331 },
  { id: 9, name: 'Leicester City',    image: require('./img/leicester.png'), location: 'Leicester', stadium: 'King Power Stadium',
  capacity:    32312, manager: 'Brendan Rodgers', captain: 'Wes Morgan', lat: 52.620399, lng: -1.142147 },
  { id: 10, name: 'Liverpool',    image: require('./img/liverpool.png'), location: 'Liverpool (Anfield)', stadium: 'Anfield',
  capacity: 54074, manager: 'Jürgen Klopp', captain: 'Jordan Henderson', lat: 53.430846, lng: -2.960844 },
  { id: 11, name:    'Manchester City',    image: require('./img/manchester-city.png'), location: 'Manchester',
  stadium: 'City of Manchester Stadium', capacity: 55017, manager: 'Pep Guardiola', captain: 'David Silva',
  lat: 53.483176, lng: -2.200427 },
  { id: 12, name:    'Manchester United',    image: require('./img/manchester-united.png'), location: 'Manchester', stadium: 'Old Trafford',
  capacity: 74879, manager: 'Ole Gunnar Solskjær', captain: 'Ashley Young', lat: 53.463077, lng: -2.291334 },
  { id: 13, name:    'Newcastle United',    image: require('./img/newcastle-united.png'), location: 'Newcastle', stadium: 'St James Park',
  capacity: 52354, manager: 'Steve Bruce', captain: 'Jamaal Lascelles', lat: 54.975581, lng: -1.621661 },
  { id: 14, name:    'Norwich City',    image: require('./img/norwich-city.png'), location: 'Norwich', stadium:    'Carrow Road',
  capacity: 27244, manager: 'Daniel Farke', captain: 'Grant Hanley', lat: 52.622219, lng: 1.309328 },
  { id: 15, name:    'Sheffield United',    image: require('./img/sheffield-united.png'), location: 'Sheffield', stadium: 'Bramall Lane',
  capacity: 32702, manager: 'Chris Wilder', captain: 'Billy Sharp', lat: 53.370374, lng:  -1.470880 },
  { id: 16, name:    'Southampton',    image: require('./img/southampton.png'), location: 'Southampton', stadium: 'St Marys Stadium',
  capacity: 32384, manager: 'Ralph Hasenhüttl', captain: 'Pierre-Emile Højbjerg', lat: 50.905860, lng: -1.390941 },
  { id: 17, name:    'Tottenham Hotspur',    image: require('./img/tottenham-hotspur.png'), location: 'London (Tottenham)',
  stadium:    'Tottenham Hotspur Stadium', capacity: 62214, manager: 'José Mourinho', captain: 'Hugo Lloris', lat: 51.604319, lng: -0.066381 },
  { id: 18, name:    'Watford',    image: require('./img/watford.png'), location: 'Watford', stadium: 'Vicarage Road',
  capacity: 20400, manager: 'Quique Sánchez Flores', captain: 'Troy Deeney', lat: 51.649959, lng: -0.401525 },
  { id: 19, name:    'West Ham United',    image: require('./img/westham-united.png'), location: 'London (Stratford)', stadium: 'London Stadium',
  capacity: 60000, manager: 'Manuel Pellegrini', captain: 'Mark Noble', lat: 51.538750, lng: -0.016625 },
  { id: 20, name:    'Wolverhampton Wanderers',    image: require('./img/wolverhampton.png'), location: 'Wolverhampton',
  stadium: 'Molineux Stadium', capacity: 32050, manager: 'Nuno Espírito Santo', captain: 'Conor Coady', lat: 52.590301, lng: -2.130418 }

Next, we will use a combination of React Native Elements ListItem and React to Native FlatList. For that, we need to install React Native Elements first and it’s dependencies.

yarn add react-native-elements
yarn add react-native-vector-icons

For iOS, go to the ios folder then install Pod.

cd ios
pod install

Also, we need to add/replace this array of UIAppFonts in ios/ReactNativeTutorial/Info.plist.


Otherwise, you will get one or more of these errors in the iOS simulator.

Unrecognized font family 'Ionicons'
Unrecognized font family 'Foundation'
Unrecognized font family 'MaterialIcons'
Unrecognized font family 'MaterialCommunityIcons'
Unrecognized font family 'SimpleLineIcons'
Unrecognized font family 'Zocial'
Unrecognized font family 'Feather'

Next, open and edit components/ListScreen.js then add these imports of react-native Stylesheet, FlatList, ActivityIndicator, View, Text, react-native-elements ListItem, Button, and Team data.

import { StyleSheet, FlatList, ActivityIndicator, View, Text } from 'react-native';
import { ListItem, Button } from 'react-native-elements';
import { Team } from '../Team';

Add these constant variables at the top of the main function body.

const [data, setData] = useState(Team);
const [showLoading, setShowLoading] = useState(true);

Add React Hooks useEffect to reload data.

useEffect(() => {
}, []);

Add a condition to show loading spinner/text based on loaded data.

if(showLoading === true){
        <View style={styles.activity}>
            <ActivityIndicator size="large" color="#0000ff"/>

Add the constant variables for React Native FlatList keyExtractor and React Native Elements ListItem.

const keyExtractor = (item, index) => index.toString();

const renderItem = ({ item }) => (
        leftAvatar={{ source: item.image }}
        onPress={() => {
            navigation.navigate('Details', {
                id: `${}`,

Replace the return function with this return function that contains React Native FlatList.

return (

Finally, add a required styles after the main function.

const styles = StyleSheet.create({
    container: {
        flex: 1,
        paddingBottom: 22
    item: {
        padding: 10,
        fontSize: 18,
        height: 44,
    activity: {
        position: 'absolute',
        left: 0,
        right: 0,
        top: 0,
        bottom: 0,
        alignItems: 'center',
        justifyContent: 'center'
    message: {
        padding: 16,
        fontSize: 18,
        color: 'red'

Show Data Details

We will show details of data using React Native Elements Card that contain Image, Button, Icon, View, and Text elements. Details data get from the filtered array of objects by ID. The ID gets from the React Native Navigation params. Open and edit components/DetailsScreen.js then add/modify these imports of react-native ScrollView, StyleSheet, Image, View, Text, react-native-elements Card, Button, Icon, and Team data.

import { ScrollView, StyleSheet, Image, View, Text } from 'react-native';
import { Card, Button, Icon } from 'react-native-elements';
import { Team } from '../Team';

Add a constant variable of details data inside the top of the main function body.

const [details, setDetails] = useState({
    id: null,
    name: '',
    image: '',
    location: '',
    stadium: '',
    capacity: null,
    manager: '',
    captain: '',
    lat: null,
    lng: null

Add the React Hooks useEffect after the constant variable.

useEffect(() => {
    const id = parseInt(navigation.getParam('id'), 0);
    setDetails(Team.find(x => === id));
}, []);

Modify the return function to display the details of data using React Native elements.

return (
        <Card style={styles.container}>
            <View style={styles.subContainer}>
            <View style={styles.detailsImage}>
                style={{minWidth: 150, minHeight: 150}}
            <View style={styles.detailsItem}>
                <Text style={{fontSize: 16}}>Team Name: {}</Text>
            <View style={styles.detailsItem}>
                <Text style={{fontSize: 16}}>City: {details.location}</Text>
            <View style={styles.detailsItem}>
                <Text style={{fontSize: 16}}>Stadium: {details.stadium}</Text>
            <View style={styles.detailsItem}>
                <Text style={{fontSize: 16}}>Stadium Capacity: {details.capacity}</Text>
            <View style={styles.detailsItem}>
                <Text style={{fontSize: 16}}>Manager: {details.manager}</Text>
            <View style={styles.detailsItem}>
                <Text style={{fontSize: 16}}>Team Captain: {details.captain}</Text>
            <View style={styles.detailButton}>
                    title='Show Maps'
                    onPress={() => {
                        navigation.navigate('Maps', {
                            lat: `${}`,
                            lng: `${details.lng}`
                    }} />

Display Google Maps

This step is a little bit complex because it involves the native iOS and Android configuration. We will use the react-native-maps module for this tutorial. For that, install that module first by type this command.

yarn add git+https://[email protected]/react-native-community/react-native-maps.git

We are adding a module using Git directly because the NPM module has an error for Android. Next, we will configure for each platform (iOS and Android). Before configuring this application natively, make sure you have enabled the Google Maps SDK for Android and iOS and have an API Key. We do not cover how to setup that in Google developer console this time, you can find in our other tutorial category.


After installing the module of react-native-maps, go to the iOS folder and install the Cocoapods.

cd ios
pod install

Next, open and edit ios/ReactNativeTutorial/AppDelegate.m then add this import.

#import <GoogleMaps/GoogleMaps.h>

Add this line to the top didFinishLaunchingWithOptions method body.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
  [GMSServices provideAPIKey:@"_YOUR_API_KEY_"];

You can fill “YOUR_API_KEY” with your Google Maps SDK for iOS API Key. Next, open and edit ios/Podfile then add these lines after other pods.

# React Native Maps dependencies
rn_maps_path = '../node_modules/react-native-maps'
pod 'react-native-google-maps', :path => rn_maps_path
pod 'GoogleMaps'
pod 'Google-Maps-iOS-Utils'

Type again this command to install the Cocoapods.

pod install


After installing the react-native-maps module, open and edit android/app/build.gradle then add these lines to dependencies block.

dependencies {
       exclude group: '', module: 'play-services-base'
       exclude group: '', module: 'play-services-maps'
    implementation ''
    implementation ''

Next, open and edit android/app/src/main/AndroidManifest.xml then add this line before the closing of .

<application ...>

Fill “YOUR_API_KEY” with your Google Maps SDK for Android API Key.

Next, we will implement Google Maps to the React Native functional component. Open and edit components/MapsScreen.js then add/modify these imports of react-native StyleSheet, View, and react-native-maps MapView.

import { StyleSheet, View } from 'react-native';
import MapView from 'react-native-maps';

Add the React Hooks useState constant variables to hold the latitude and longitude from the params.

const [latitude, setLatitude] = useState(parseFloat(navigation.getParam('lat')));
const [longitude, setLongitude] = useState(parseFloat(navigation.getParam('lng')));

Add this React Hooks useEffect to reload the longitude and latitude from the params.

useEffect(() => {
}, []);

Modify the return function to this return function that implements react-native-maps MapView.

return (
    <View style={styles.container}>
            latitude: latitude,
            longitude: longitude,
            latitudeDelta: 0.0522,
            longitudeDelta: 0.0021,

Don’t forget to add the Stylesheet after the main function to show the Google Maps on the React Native screen.

const styles = StyleSheet.create({
    container: {
        flex: 1
    map: {
        flex: 1

Run and Test the React Native Mobile Apps

To run the React Native Mobile Apps on iOS simulator type this command.

react-native run-ios

After the new terminal tab opened, type this command immediately inside the same project folder.

yarn start

For Android, type this command.

react-native run-android

After the new terminal tab opened, type this command immediately inside the same project folder.

yarn start

And here the sample working application from this tutorial.

React Native Tutorial: Building Mobile Apps with React Hooks - List
React Native Tutorial: Building Mobile Apps with React Hooks - Details
React Native Tutorial: Building Mobile Apps with React Hooks - Maps

That it’s, React Native Tutorial: Building Mobile Apps with React Hooks. You can find the full source code from our GitHub.

#React #ReactNative #MobileApp

What is GEEK

Buddha Community

How to build Mobile Apps with React Hooks
Autumn  Blick

Autumn Blick


How native is React Native? | React Native vs Native App Development

If you are undertaking a mobile app development for your start-up or enterprise, you are likely wondering whether to use React Native. As a popular development framework, React Native helps you to develop near-native mobile apps. However, you are probably also wondering how close you can get to a native app by using React Native. How native is React Native?

In the article, we discuss the similarities between native mobile development and development using React Native. We also touch upon where they differ and how to bridge the gaps. Read on.

A brief introduction to React Native

Let’s briefly set the context first. We will briefly touch upon what React Native is and how it differs from earlier hybrid frameworks.

React Native is a popular JavaScript framework that Facebook has created. You can use this open-source framework to code natively rendering Android and iOS mobile apps. You can use it to develop web apps too.

Facebook has developed React Native based on React, its JavaScript library. The first release of React Native came in March 2015. At the time of writing this article, the latest stable release of React Native is 0.62.0, and it was released in March 2020.

Although relatively new, React Native has acquired a high degree of popularity. The “Stack Overflow Developer Survey 2019” report identifies it as the 8th most loved framework. Facebook, Walmart, and Bloomberg are some of the top companies that use React Native.

The popularity of React Native comes from its advantages. Some of its advantages are as follows:

  • Performance: It delivers optimal performance.
  • Cross-platform development: You can develop both Android and iOS apps with it. The reuse of code expedites development and reduces costs.
  • UI design: React Native enables you to design simple and responsive UI for your mobile app.
  • 3rd party plugins: This framework supports 3rd party plugins.
  • Developer community: A vibrant community of developers support React Native.

Why React Native is fundamentally different from earlier hybrid frameworks

Are you wondering whether React Native is just another of those hybrid frameworks like Ionic or Cordova? It’s not! React Native is fundamentally different from these earlier hybrid frameworks.

React Native is very close to native. Consider the following aspects as described on the React Native website:

  • Access to many native platforms features: The primitives of React Native render to native platform UI. This means that your React Native app will use many native platform APIs as native apps would do.
  • Near-native user experience: React Native provides several native components, and these are platform agnostic.
  • The ease of accessing native APIs: React Native uses a declarative UI paradigm. This enables React Native to interact easily with native platform APIs since React Native wraps existing native code.

Due to these factors, React Native offers many more advantages compared to those earlier hybrid frameworks. We now review them.

#android app #frontend #ios app #mobile app development #benefits of react native #is react native good for mobile app development #native vs #pros and cons of react native #react mobile development #react native development #react native experience #react native framework #react native ios vs android #react native pros and cons #react native vs android #react native vs native #react native vs native performance #react vs native #why react native #why use react native

How React Native Is Shaping Mobile App Development

Are you a mobile app developer looking for more efficient tools for your projects? Mobile app development is getting tougher and tougher as the market continues to grow. As a developer, you need to develop Apps which meet the demands of your users. To achieve this, adopt the right tools, like the React Native development framework.

Based on Statista data, the global mobile app market will generate over $935 billion in 2023 from more than $365 billion in 2018. The majority of this amount will come from in-app advertising and paid downloads. To gain a share in the marketplace, companies need to embrace new technologies to provide what consumers are looking for, such as seamless navigation and aesthetic appeal—the React Native development framework makes it all possible.

Table of Contents

  • What is Mobile App Development?
  • What are the Types of Apps?
  • What are the Components of Mobile App Architecture?
  • Things to Consider in Mobile App Development
  • What is React Native?
  • Top Reasons Why React Native is the Future of Mobile App Development
  • Useful Tips on How to Become an Excellent React Native Developer

#mobile-app-development #mobile-apps #react #react-native #android-app-development #app-development #ios-app-development #create-react-native-app

Autumn  Blick

Autumn Blick


How To Succeed In Mobile App Wireframe Design?

In the world of overrated terms “web development”, a mobile app wireframe design is one of the most underrated terms. The design of wireframes is considered when people look for the bigger picture.

While designing the UI-UX, people forget the simple norm of general to specific shifting. As the complexity increases and so does the approach become more difficult, this is where the designing of the wireframes comes in handy.

Before diving into the “How to”, let’s first see why we need them in the first place.

What are mobile app wireframes?

Wireframes are the skeletal layouts of an application or a website that is being designed. The specificity comes into play, the elements and the features have to be placed at specific locations. Take a building, in the process of making it, first the foundation is laid and then pieces are fitted together from the skeleton structure on a piece of paper, wireframes do the same for the website or application structure such as a smart home application.

The designing of wireframes is commonly known as wireframing. For the construction of a building, the framework or the skeletal structure is important while designing a web application or mobile application, wireframing is important to make it user-friendly. This entirely and solely works to make the journey smooth and destination easy to reach.

As for the building, the layers of cementing and painting is done later to increase the visual appeal, the visual contents and appealing stuff are added after wireframing. The simpler it sounds after the definition, the complex it gets when it is being done.

It is a very goal-oriented procedure, one has to keep in mind is the goal of the product or the destination of the service. The main focus should be on UX. The arrangement of the elements and their interaction with each other and with the user is the utmost important task in mobile app wireframing.

What not to do while designing the mobile app wireframe?

  • Do not even think of skipping the process.
  • Do not beautify (visually appealing designs added first) and then get into the wireframing business).
  • Do not do it just for the sake of doing it.

One has to keep in mind that skipping this entirely can lead to the failure of the entire process of web and mobile app development at the end.

Again taking the example of the construction of a building, the foundation must be laid first based on the skeletal framework that has been prepared, then only you can jump to beautify your building, as a designer one has to understand and follow the steps where designing the mobile app wireframe comes first and then the visually appealing content is added next not the other way round.

For the most part, people do not understand the importance and come up with some trashy design of wireframes and the main foundation becomes faulty, hence the entire designing at later stages becomes faulty. If one wants to skip the reworking part, mobile app wireframing must never be ignored.

#android app #ios app #minimum viable product (mvp) #mobile app development #app designing #mobile app wireframe designing #mobile app wireframing #mobile application wireframing #mobile wireframing #web app wireframing #wireframe designing

Jones Brianna

Jones Brianna


List Of The Top Pittsburgh Mobile App Development Companies
Let’s look at the list of top list of the top Pittsburgh mobile app development companies which are known for providing top-notch services globally. They are great developers who provide quality services for all your needs.

#mobile app developers #mobile app development services #mobile app development #mobile app developers #mobile apps #mobile app development solutions

Jones Brianna

Jones Brianna


Top 10 Mobile App Development Companies in India

Here’s a rundown of Top 10 mobile app development companies in India, carefully evaluated on the various performance indicators based on proven track record and diversified portfolio, quality of end-product, experience, core technical expertise, project management strategy, adherence to timelines and budget, app prototyping and UI/UX design.

#mobile app development #mobile app development company #mobile app development services #mobile app developers #mobile app development solutions #mobile apps