Навигация по сканеру штрих-кода React Native Expo

Я новичок в react native и expo, и я следовал учебнику в Интернете для приложения для сканирования штрих-кодов с помощью expo, но он не охватывает, как перейти от приложения камеры expo к другому экрану, и я не могу понять это. У меня работает сканер, и я создал django rest backend с данными qrcode, но он применяет только имя файла, а я хочу перейти на страницу, которая также содержит имя и описание, перечисленные в моей модели django. Я уверен, что мне, вероятно, придется каким-то образом обновить мою модель django, но я действительно мог бы использовать некоторую помощь в коде. Вот моя модель django:

from django.db import models
import qrcode
from io import BytesIO
from django.core.files.base import ContentFile
from PIL import Image


class Event(models.Model):
   name = models.CharField(max_length=200)
   description = models.TextField()
   qr_code = models.ImageField(blank=True, upload_to='qrcodes/')
   date = models.DateField()

   def __str__(self):
        return str(self.name)

   def save(self, *args, **kwargs):
    if not self.qr_code:
        qrcode_img = qrcode.make(self.name)
        canvas = Image.new('RGB', (qrcode_img.pixel_size, qrcode_img.pixel_size), 'white')
        canvas.paste(qrcode_img)
        fname = f'{self.name}.png'
        buffer = BytesIO()
        canvas.save(buffer, 'PNG')
        self.qr_code.save(fname, ContentFile(buffer.getvalue()), save=False)
    super().save(*args, **kwargs)

и вот мой экран сканера штрих-кодов в react:

import React, { useState, useEffect } from "react";
import { Text, View, StyleSheet, Button } from "react-native";
import { CameraView, Camera } from "expo-camera";
import { useNavigation } from "@react-navigation/native";

export default function App() {
  const [hasPermission, setHasPermission] = useState(null);
  const [scanned, setScanned] = useState(false);

  useEffect(() => {
    const getCameraPermissions = async () => {
      const { status } = await Camera.requestCameraPermissionsAsync();
      setHasPermission(status === "granted");
    };

    getCameraPermissions();
  }, []);

  const navigation = useNavigation()
  const handleBarCodeScanned = ({ type, data }) => {

    setScanned(true);
    // alert(`Bar code with type ${type} and data ${data} has been scanned!`);

    if (data) {
        navigation.navigate('Event', {eventId: data} )
    }
  };

  if (hasPermission === null) {
    return <Text>Requesting for camera permission</Text>;
  }
  if (hasPermission === false) {
    return <Text>No access to camera</Text>;
  }

  return (
    <View style={styles.container}>
      <CameraView
        onBarcodeScanned={scanned ? undefined : handleBarCodeScanned}
        barcodeScannerSettings={{
          barcodeTypes: ["qr", "pdf417"],
        }}
        style={StyleSheet.absoluteFillObject}
      />
      {scanned && (
        <Button title={"Tap to Scan Again"} onPress={() => setScanned(false)} />
      )}
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    flexDirection: "column",
    justifyContent: "center",
  },
});

И наконец, вот экран событий, на который я хочу перейти на основе штрихкода

import { useNavigation, useRoute } from "@react-navigation/native";
import { useLayoutEffect } from "react";
import { View, Text, StyleSheet } from "react-native";
import { HeaderBackButton } from '@react-navigation/elements';

const EventDetailScreen = () => {
    const route = useRoute()
    const navigation = useNavigation()

    const {eventId, name, description} = route.params

    useLayoutEffect(()=> {
        navigation.setOptions({
            headerTitle: name,
            headerLeft: () => (
                <HeaderBackButton
                    tintColor="white"
                    onPress={()=> navigation.goBack()}
                />
            )
        }, [])
    })

    return (
        <View style={ Styles.screen }>
            <Text style={{fontSize: 20}} >This is the event detail screen for {eventId}</Text>
            <Text style={{fontSize: 20}} >{name}</Text>
            <Text style={{fontSize: 20}} >{description}</Text>
        </View>
    );
}

const Styles = StyleSheet.create({
    screen: {
        padding:20,
    }
})

export default EventDetailScreen

Любая помощь будет очень признательна. Заранее спасибо

Как вы уже говорили,

if (data) {
    navigation.navigate('Event', {eventId: data} )
}

Например. если 'Event' содержит строку, которая может быть заголовком страницы навигации, например:

javascript

        import Keypage from './key_page'
<Stack.Screen name="Keypage" component={Keypage} options={{ headerShown: false, animationEnabled: true, animationEnabled: true, gestureEnabled: false }} />

Если "Событие" равно "Ключевая страница", экран просто переходит к экрану "Ключевая страница" с реквизитом eventId в качестве данных с экрана сканера.

Вернуться на верх