0
0
React Nativemobile~20 mins

Expo modules in React Native - Practice Problems & Coding Challenges

Choose your learning style9 modes available
Challenge - 5 Problems
🎖️
Expo Modules Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
ui_behavior
intermediate
2:00remaining
Using Expo Camera Module to Capture a Photo
What will happen when the user taps the button in this React Native Expo app code?
React Native
import React, { useState, useRef } from 'react';
import { View, Button, Image } from 'react-native';
import { Camera } from 'expo-camera';

export default function App() {
  const [hasPermission, setHasPermission] = useState(null);
  const [photoUri, setPhotoUri] = useState(null);
  const cameraRef = useRef(null);

  React.useEffect(() => {
    (async () => {
      const { status } = await Camera.requestCameraPermissionsAsync();
      setHasPermission(status === 'granted');
    })();
  }, []);

  const takePicture = async () => {
    if (cameraRef.current) {
      const photo = await cameraRef.current.takePictureAsync();
      setPhotoUri(photo.uri);
    }
  };

  if (hasPermission === null) {
    return <View />;
  }
  if (hasPermission === false) {
    return <View><Button title="No access to camera" disabled /></View>;
  }

  return (
    <View style={{ flex: 1 }}>
      <Camera style={{ flex: 1 }} ref={cameraRef} />
      <Button title="Take Photo" onPress={takePicture} />
      {photoUri && <Image source={{ uri: photoUri }} style={{ flex: 1 }} />}
    </View>
  );
}
AThe app asks for camera permission, shows the camera preview, and when the button is tapped, it takes a photo and displays it below the button.
BThe app crashes because Camera module is not imported correctly.
CThe app shows a blank screen because the camera permission is never requested.
DThe button does nothing because takePicture function is not connected to the button.
Attempts:
2 left
💡 Hint
Look at how the Camera permission is requested and how the takePicture function is used.
lifecycle
intermediate
2:00remaining
Effect of useEffect Dependency on Expo Location Module
Consider this React Native Expo code snippet using the Location module. What will happen if the dependency array in useEffect is empty versus if it includes a state variable 'tracking'?
React Native
import React, { useState, useEffect } from 'react';
import { View, Text, Button } from 'react-native';
import * as Location from 'expo-location';

export default function App() {
  const [location, setLocation] = useState(null);
  const [tracking, setTracking] = useState(false);

  useEffect(() => {
    let subscriber;
    if (tracking) {
      (async () => {
        const { status } = await Location.requestForegroundPermissionsAsync();
        if (status === 'granted') {
          subscriber = await Location.watchPositionAsync({ accuracy: Location.Accuracy.High }, loc => {
            setLocation(loc);
          });
        }
      })();
    } else if (subscriber) {
      subscriber.remove();
    }
    return () => subscriber?.remove();
  }, [tracking]);

  return (
    <View>
      <Button title={tracking ? 'Stop Tracking' : 'Start Tracking'} onPress={() => setTracking(!tracking)} />
      <Text>{location ? JSON.stringify(location.coords) : 'No location'}</Text>
    </View>
  );
}
AWith an empty dependency array, location tracking starts only once on mount and never updates when 'tracking' changes; with [tracking], it starts and stops tracking correctly when 'tracking' changes.
BWith an empty dependency array, the app crashes; with [tracking], it never requests permission.
CWith an empty dependency array, tracking toggles correctly; with [tracking], the location never updates.
DBoth cases behave the same and continuously track location regardless of 'tracking' state.
Attempts:
2 left
💡 Hint
Think about when useEffect runs based on its dependency array.
📝 Syntax
advanced
2:00remaining
Correct Import and Usage of Expo Notifications Module
Which option correctly imports and schedules a local notification using Expo Notifications in a React Native app?
A
import * as Notifications from 'expo-notifications';

Notifications.scheduleLocalNotification({
  title: 'Hello',
  trigger: { seconds: 5 }
});
B
import { scheduleNotificationAsync } from 'expo-notifications';

scheduleNotificationAsync({
  content: { title: 'Hello' },
  trigger: { seconds: 5 }
});
C
import * as Notifications from 'expo-notifications';

Notifications.scheduleNotificationAsync({
  content: { title: 'Hello' },
  trigger: { seconds: 5 }
});
D
import Notifications from 'expo-notifications';

Notifications.schedule({
  content: { title: 'Hello' },
  trigger: { seconds: 5 }
});
Attempts:
2 left
💡 Hint
Check the official Expo Notifications API for method names and import style.
🔧 Debug
advanced
2:00remaining
Debugging Expo Audio Playback Issue
Given this code snippet using Expo Audio module, the sound does not play when the button is pressed. What is the most likely cause?
React Native
import React, { useState } from 'react';
import { View, Button } from 'react-native';
import { Audio } from 'expo-av';

export default function App() {
  const [sound, setSound] = useState();

  async function playSound() {
    const { sound: newSound } = await Audio.Sound.createAsync(
      require('./assets/sound.mp3')
    );
    setSound(newSound);
    await newSound.playAsync();
  }

  return (
    <View>
      <Button title="Play Sound" onPress={playSound} />
    </View>
  );
}
AThe require path is incorrect; it should be a URL string instead of require.
BThe sound variable is shadowed inside playSound, so the state 'sound' is not set properly, causing no playback.
CThe playAsync method is asynchronous and must be awaited outside the function.
DThe Audio module is not imported correctly; it should be imported from 'expo-audio' instead of 'expo-av'.
Attempts:
2 left
💡 Hint
Look carefully at variable names and state usage inside the async function.
🧠 Conceptual
expert
2:00remaining
Understanding Expo Module Linking and Bare Workflow
Which statement best describes the difference in using Expo modules in Managed workflow versus Bare workflow in React Native?
ABoth workflows require manual linking of Expo modules and native code configuration.
BIn Bare workflow, Expo modules are pre-installed and require no configuration; in Managed workflow, you must eject to use native modules.
CExpo modules cannot be used in Bare workflow; they only work in Managed workflow.
DIn Managed workflow, Expo modules are pre-linked and configured automatically; in Bare workflow, you must manually install and link native modules and configure native projects.
Attempts:
2 left
💡 Hint
Think about how Expo handles native code in Managed vs Bare workflows.