Let's initialize a React Native project using React Native's CLI. The project will be named imageShare
and will be available for iOS and Android devices:
react-native init --version="0.44.0" imageShare
In order to use some packages in this app, we will be using a specific version of React Native (0.44.0
).
We will be using Redux for our app, so we will create a folder structure in which we can accommodate our reducers
, actions
, components
, screens
, and api
calls:
Moreover, we have added logo.png
in the img
folder. For the rest, we have a very standard React Native project. The entry point will be index.ios.js
for iOS and index.android.js
for Android:
/*** index.ios.js and index.android.js ***/ import { AppRegistry } from 'react-native'; import App from './src/main'; AppRegistry.registerComponent('imageShare', () => App);
We have the same implementation for both files as we want to use src/main.js
as the common entry point for both platforms.
Let's jump into our package.json
file to understand which dependencies we will have in our app:
/*** package.json ***/ { "name": "imageShare", "version": "0.0.1", "private": true, "scripts": { "start": "node node_modules/react-native/ local-cli/cli.js start", "test": "jest" }, "dependencies": { "native-base": "^2.1.5", "react": "16.0.0-alpha.6", "react-native": "0.44.0", "react-native-camera": "^0.8.0", "react-navigation": "^1.0.0-beta.9", "react-redux": "^5.0.5", "redux": "^3.6.0", "redux-thunk": "^2.2.0" }, "devDependencies": { "babel-jest": "20.0.3", "babel-preset-react-native": "1.9.2", "jest": "20.0.3", "react-test-renderer": "16.0.0-alpha.6" }, "jest": { "preset": "react-native" } }
Some of the dependencies, such as react-navigation
or native-base
, are old acquaintances from previous lessons. Others, such as react-native-camera
, will be introduced in this lesson for the first time. Some of them are closely related to the state management library we will be using for this app, Redux:
redux
: This is the state management library itselfreact-redux
: These are the React handlers for Reduxredux-thunk
: This is Redux middleware that handles asynchronous action executionTo complete the installation, we will need to link react-native-camera
as it requires some changes in the native part of our app:
react-native link react-native-camera
On iOS 10 and higher, we also need to modify our ios/imageShare/Info.plist
to add a Camera Usage Description, which should be displayed to request permission to enable the camera within the app. We need to add these lines right before the last </dict></plist>
:
<key>NSCameraUsageDescription</key> <string>imageShare requires access to the camera on this device to perform this action</string> <key>NSPhotoLibraryUsageDescription</key> <string>imageShare requires access to the image library on this device to perform this action</string>
3.147.80.3