Ha még nem ismeri az expót, akkor ez egy olyan kliens, amely kevesebb összetettséggel segít a React Native alkalmazások elkészítésében. Ez is segít megbirkózni a React Native futtatásához szükséges környezet telepítésével és beállításával.
Ebben az oktatóanyagban egy egyszerű kameraalkalmazást építünk, amelyben a felhasználó képeket készíthet, megtekintheti a képek előnézeteit, használhatja a vakumódot, és válthat az első és a hátsó kamera között.
Előfeltételek
Az Expo nem igényel sokat az első React Native alkalmazás elkészítésének megkezdéséhez. Az expo és az expo-cli telepítéséről itt tudhat meg többet a dokumentációban.
Megjegyzés: ebben az oktatóanyagban macOS-t és iOS-t fogok használni. Használhatja az Androidot is, nincs sok különbség az expo használatakor ekkor.
Az expo és az expo-cli globálisan telepíthető a következő parancs futtatásával:
npm install --global expo-cli
Az Expo futtatásához Nodejs szükséges. A legfrissebb verziót itt futtathatja a hivatalos weboldalon.
Elkezdeni
Az Expo és a Nodejs telepítése után elindíthatja az új Expo projekt indítását az alábbi paranccsal:
expo init expo-camera-app
A csomagok telepítése és az alkalmazás futtatása
Az Expo egy kliens alkalmazást biztosít számunkra, ahol futtathatjuk és megtekinthetjük az épülő alkalmazás előnézetét. Letölthető az App Store-ból és a Google Play-ből is.
Ez az alkalmazás kezelőfelülete.

Hogyan lehet egy expo projektet elindítani
Menjen az alkalmazás könyvtárába, és futtassa az alkalmazást.
cd expo-camera-app
Néhány kérdést fognak feltenni az alkalmazás alapértelmezett sablonjának kiválasztásához. Ebben az oktatóanyagban egyszerűen kiválasztunk egy üres (TypeScript) opciót, de ismét szabadon választhatja ki a megfelelőt.

Futtassa az alkalmazást
A projekt indítása után futtathatjuk az alkalmazást expo run

Ez megnyit egy ablakot a böngészőben, ahol láthatja a naplókat. Ezenkívül generál egy QR-kódot, amelyet beolvasva futtathatja az alkalmazást a készüléken.
Az expo jó tulajdonsága, hogy az alkalmazás futtatásához nem kell telepíteni és konfigurálni a szimulátorokat. Ez még mindig lehetőséget nyújt az expo futtatására a szimulátoron, de egyedül kell telepítenie és konfigurálnia a szimulátort.
Vissza az alkalmazásunkhoz. Feltéve, hogy sikeresen futtatta az alkalmazást az eszközön, ez lesz az alapértelmezett képernyő:

Nyissa meg az alkalmazáskönyvtárat a kedvenc kódszerkesztőben. VS kódot használok.
Az App.tsx
így fog kinézni:
import {StatusBar} from 'expo-status-bar' import React from 'react' import {StyleSheet, Text, View} from 'react-native' export default function App() { return ( Open up App.tsx to start working on your app! ) } const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: '#fff', alignItems: 'center', justifyContent: 'center' } })
Az UI létrehozása
A projekt futtatása után itt az ideje elkezdeni néhány felhasználói felület létrehozását.
Telepítse az expo-kamerát
A következő lépés az expo-camera telepítése, így:
expo install expo-camera
Létrehozunk egy egyszerű felhasználói felületet, amely lehetővé teszi a felhasználó számára a kamera használatának megkezdését.

import {StatusBar} from 'expo-status-bar' import React from 'react' import {StyleSheet, Text, View, TouchableOpacity} from 'react-native' export default function App() { return ( Take picture ) } const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: '#fff', alignItems: 'center', justifyContent: 'center' } })
Ez egy egyszerű felhasználói felület: importáljuk TouchableOpacity
a gombot, és néhány egyszerű stílust készítünk . Ha kíváncsi vagy, hogyan működik a stílus a React Native-ban, itt megnézheted két cikkemet:
- Stílus a React Native-ban
- Demoxifikáló Flexbox a React Native-ban
Most useState
horgot kell használnunk az állapot kezeléséhez és a kamera nézetének megjelenítéséhez, amikor a felhasználó megnyomja a kép készítése gombot.
Take picture
const [startCamera,setStartCamera] = React.useState(false) const __startCamera = ()=>{ }
Két fontos dolgot kell tennünk, amikor a felhasználó megnyomja a gombot:
- Kérjen engedélyt a kamera eléréséhez. A mobilfejlesztésben sok natív API-hoz és mobilfunkcióhoz való hozzáférést gyakran korlátozza a felhasználó engedélyei és az adatvédelem. Ez csak valami, amit meg kell szoknia a mobilalkalmazások fejlesztésekor.
- Change the state and present the camera.
Let's import the camera module from expo-camera
with this command:
import {Camera} from 'expo-camera'
And add the camera view, like this:
{ camera = r }} >
We can use ref
to access the camera's methods:
let camera: Camera
When the take picture
button is pressed the __startCamera
function will be called:
const __startCamera = async () => { const {status} = await Camera.requestPermissionsAsync() if(status === 'granted'){ // do something }else{ Alert.alert("Access denied") }
The function will ask for permission first. If the user grant access to the camera, we can proceed and open the camera. If not, we show a simple alert.
Add the camera component
Let's display the camera when the user grants access to the device's camera.
const __startCamera = async () => { const {status} = await Camera.requestPermissionsAsync() if (status === 'granted') { // start the camera setStartCamera(true) } else { Alert.alert('Access denied') } }
We have to make some changes to the UI and add a conditional rendering. We display the camera only when the user requests it, otherwise we display the default screen.
{startCamera ? ( { camera = r }} > ) : ( Take picture )}

Cool, now we need to add a button so we can take the actual picture.
Add the capture button

This is a simple View
inside the camera view that has an absolute position. So we make sure that it is always on the top of the camera.
How to take a picture
The app should take a picture when capture button is pressed. That function will look like the below:
const __takePicture = async () => { if (!camera) return const photo = await camera.takePictureAsync() }
First, we check that we have access to the Camera
component using ref
:
if (!camera) return // if the camera is undefined or null, we stop the function execution
Then we take the picture by calling the takePictureAsync
method. It returns a promise and an object that contains the picture's details. The result will look like this:
Object { "height": 4224, "uri": "file:///var/mobile/Containers/Data/Application/E6740A15-93AF-4120-BF11-6E8B74AFBF93/Library/Caches/ExponentExperienceData/%2540anonymous%252Fcamera-app-ee0fa3c8-1bb1-4d62-9863-33bf26341c55/Camera/19F0C5DD-7CA6-4043-8D89-AF65A1055C7E.jpg", "width": 1952, }
We are only interested in the Picture URL uri
. After we take a picture, we have to show the photo preview and hide the camera view. To do that we will use two hooks to change the state:
const [previewVisible, setPreviewVisible] = useState(false) const [capturedImage, setCapturedImage] = useState(null)
const __takePicture = async () => { if (!camera) return const photo = await camera.takePictureAsync() console.log(photo) setPreviewVisible(true) setCapturedImage(photo) }
setPreviewVisible
to show the previewsetCapturedImage(photo)
to store the object result
Then we display the preview like this:
{previewVisible && capturedImage ? ( ) : ( { camera = r }} > )}
The CameraPreview
component looks like this:
const CameraPreview = ({photo}: any) => { console.log('sdsfds', photo) return ( ) }
And the result looks like this:

How to re-take a picture
We can add some buttons to the preview that will allow the user to perform more actions. For example, they could re-take the photo or save it.

Add the savePhoto
and retakePicture
props to the CameraPreview
component like this:
When the Re-take
button is pressed, we will have to hide the preview, remove the current picture, and show the camera again. Do that with the following code:
const __retakePicture = () => { setCapturedImage(null) setPreviewVisible(false) __startCamera() }

How to add other options – back camera, flash, and more
expo-camra offers many options for customizing the camera, like FlashMode, setting the Camera type (front/back), zooming, and so on.
How to add FlashMode
Let's add an option so the user can turn FlashMode on and off:

We simply create a small button to switch off/on the flash, like this:
⚡️
And we just change the state when the button is pressed:
const [flashMode, setFlashMode] = React.useState('off') const __handleFlashMode = () => { if (flashMode === 'on') { setFlashMode('off') } else if (flashMode === 'off') { setFlashMode('on') } else { setFlashMode('auto') } }
And then we add FlashMode props:
{ camera = r }} >
How to access the front and the back camera
We will add a button that switches between the back and front camera.
We can get the default camera type directly from the camera module like below:
const [cameraType, setCameraType] = React.useState(Camera.Constants.Type.back)
Add type
props like this:
{ camera = r }} >
And add the switch button:
{cameraType === 'front' ? '?' : '?'}
And switch function:
const __switchCamera = () => { if (cameraType === 'back') { setCameraType('front') } else { setCameraType('back') } }
Here is the result:

You can find the full source code on GitHub.
Wrapping up
In general, Expo is an amazing tool that can save you a lot of time. It helps you start building directly and saves you the pain of environment setup.
Néha érdemes létrehozni egy natív kiterjesztést, és a natív funkciók használatával a maga módján kezelni. Ebben az esetben azt javaslom, hogy használja a reakt-natív CLI-t, így könnyedén módosíthatja és lejátszhatja a natív kódot.
Szia, a nevem Said Hayani. Az Subsi.io-t azért hoztam létre, hogy segítsek az alkotóknak, bloggereknek és az influencereknek a hírlevélen keresztül növelni közönségüket.Csatlakozzon a Levelezőlistámhoz, ha érdekelne többet a React Native-ról.