How to create a React Native app (4)?

How to use env file?

How to control network communication?

Setup react-query

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
yarn add react-query
yarn add react-query
yarn add react-query
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
import React from 'react'
import Home from './src/screens/Home'
import { QueryClient, QueryClientProvider } from 'react-query'
export default function App() {
const queryClient = new QueryClient()
return <QueryClientProvider client={queryClient}><Home /></QueryClientProvider>
}
import React from 'react' import Home from './src/screens/Home' import { QueryClient, QueryClientProvider } from 'react-query' export default function App() { const queryClient = new QueryClient() return <QueryClientProvider client={queryClient}><Home /></QueryClientProvider> }
import React from 'react'
import Home from './src/screens/Home'
import { QueryClient, QueryClientProvider } from 'react-query'

export default function App() {
  const queryClient = new QueryClient()
  return <QueryClientProvider client={queryClient}><Home /></QueryClientProvider>
}

Rest with axios

  • Create axios instance
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
const axiosInstance = axios.create({
baseURL: API_BASE_URL,
timeout: 10000,
headers: {
Accept: 'application/json',
'Content-Type': 'application/json; charset=utf-8',
},
});
const axiosInstance = axios.create({ baseURL: API_BASE_URL, timeout: 10000, headers: { Accept: 'application/json', 'Content-Type': 'application/json; charset=utf-8', }, });
const axiosInstance = axios.create({
  baseURL: API_BASE_URL,
  timeout: 10000,
  headers: {
    Accept: 'application/json',
    'Content-Type': 'application/json; charset=utf-8',
  },
});
  • Create api request with Promise or Await
    reference:
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
export const fetchData = (authApiUrl) => {
const promise = new Promise((resolve, reject) => {
const success = (response) => {
resolve(response);
};
const fail = (error) => {
reject(error);
};
axiosInstance.get(authApiUrl)
.then(success)
.catch(fail);
});
return promise;
};
export const fetchData = (authApiUrl) => { const promise = new Promise((resolve, reject) => { const success = (response) => { resolve(response); }; const fail = (error) => { reject(error); }; axiosInstance.get(authApiUrl) .then(success) .catch(fail); }); return promise; };
export const fetchData = (authApiUrl) => {
  const promise = new Promise((resolve, reject) => {
    const success = (response) => {
      resolve(response);
    };

    const fail = (error) => {
      reject(error);
    };

    axiosInstance.get(authApiUrl)
      .then(success)
      .catch(fail);
  });

  return promise;
};
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
export const fetchData = async (authApiUrl) => {
const response = await axiosInstance.get(authApiUrl)
return response
};
export const fetchData = async (authApiUrl) => { const response = await axiosInstance.get(authApiUrl) return response };
export const fetchData = async (authApiUrl) => {
  const response = await axiosInstance.get(authApiUrl)
  return response
};

Usage

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
import React from 'react'
import { fetchData } from '../../network'
import { useQuery } from 'react-query'
export default function Home() {
let test
const { data, isLoading } = useQuery(
['fetchData', 'dataType'],
() => fetchData(dataType)
)
if (isLoading) {
test = 'Loading...'
}
if (data) {
test = data[0].name
}
return (
<Text>{test}</Text>
);
}
import React from 'react' import { fetchData } from '../../network' import { useQuery } from 'react-query' export default function Home() { let test const { data, isLoading } = useQuery( ['fetchData', 'dataType'], () => fetchData(dataType) ) if (isLoading) { test = 'Loading...' } if (data) { test = data[0].name } return ( <Text>{test}</Text> ); }
import React from 'react'
import { fetchData } from '../../network'
import { useQuery } from 'react-query'

export default function Home() {

  let test
  const { data, isLoading } = useQuery(
    ['fetchData', 'dataType'],
    () => fetchData(dataType)
  )

  if (isLoading) {
    test = 'Loading...'
  }

  if (data) {
    test = data[0].name
  }

  return (
    <Text>{test}</Text>
  );
}

Debug with Flipper

  • Open Setup Doctor to see if configuration is correct
  • Open File > Preferences to setup Android SDK location if it’s invalid
    • Path needs to be abosulte path
      ~/Library/Android/sdk Wrong
      /Users/hung/Library/Android/sdk Right
  • Then, add Network plugin

How to control navigation?

Use react-navigation

Setup

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
yarn add @react-navigation/native
yarn add @react-navigation/native
yarn add @react-navigation/native
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
yarn add @react-navigation/native-stack
yarn add @react-navigation/native-stack
yarn add @react-navigation/native-stack

Expo

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
expo install react-native-screens react-native-safe-area-context
expo install react-native-screens react-native-safe-area-context
expo install react-native-screens react-native-safe-area-context

Usage

routing/index.js

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
import React from 'react'
import { NavigationContainer } from '@react-navigation/native'
import { MainStack } from './components/MainStack'
const Routing = () => {
return (
<NavigationContainer>
<MainStack />
</NavigationContainer>
)
}
export default Routing
import React from 'react' import { NavigationContainer } from '@react-navigation/native' import { MainStack } from './components/MainStack' const Routing = () => { return ( <NavigationContainer> <MainStack /> </NavigationContainer> ) } export default Routing
import React from 'react'
import { NavigationContainer } from '@react-navigation/native'
import { MainStack } from './components/MainStack'

const Routing = () => {
    return (
        <NavigationContainer>
            <MainStack />
        </NavigationContainer>
    )
}

export default Routing

routing/components/MainStack.js

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
import React from 'react'
import { createNativeStackNavigator } from '@react-navigation/native-stack'
import Home from '../../screens/Home'
const Stack = createNativeStackNavigator();
const MainStack = () => {
return <Stack.Navigator>
<Stack.Screen name="Home" component={Home} />
</Stack.Navigator>
}
export default MainStack
import React from 'react' import { createNativeStackNavigator } from '@react-navigation/native-stack' import Home from '../../screens/Home' const Stack = createNativeStackNavigator(); const MainStack = () => { return <Stack.Navigator> <Stack.Screen name="Home" component={Home} /> </Stack.Navigator> } export default MainStack
import React from 'react'
import { createNativeStackNavigator } from '@react-navigation/native-stack'
import Home from '../../screens/Home'

const Stack = createNativeStackNavigator();

const MainStack = () => {
    return <Stack.Navigator>
        <Stack.Screen name="Home" component={Home} />
    </Stack.Navigator>
}

export default MainStack

react-native-screens

  • This package is installed with react-navigation v5, v6
  • This helps to improve performance of the app, if there is bug relating to this, you can turn it off in root file
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
import { enableScreens } from 'react-native-screens'
if (!IS_ANDROID) {
enableScreens(false)
}
import { enableScreens } from 'react-native-screens' if (!IS_ANDROID) { enableScreens(false) }
import { enableScreens } from 'react-native-screens'

if (!IS_ANDROID) {
  enableScreens(false)
}

How to manage app state?

Use redux and redux-toolkits

Be the first to comment

Leave a Reply

Your email address will not be published.


*