NUR beim Ausführen der nativen App kommt es zu dem Fehler. Während der Entwicklung fällt der Fehler nicht auf.
Nachvollziehen kann man den Fehler, bevor man einen Releasbuild in der Expo-Cloud macht, auch schon durch einen lokalen Build. So spart man sich Zeit und vorallem Buildkontingent im Free-Plan von Expo.
Dafür macht man den Prebuild, startet das Projekt (.workspace-Datei !) in XCode und führt es am besten im Simulator aus. Dabei kommt es zu folgendem Fehler:
This error is located at:
in PanGestureHandler (created by PanGestureHandler)
in PanGestureHandler (created by Card)
in RCTView (created by View)
in View
in Unknown (created by Card)
in RCTView (created by View)
in View (created by Card)
in Card (created by CardContainer)
in CardContainer (created by CardStack)
in RNSScreen
in Unknown (created by InnerScreen)
in Suspender (created by Freeze)
in Suspense (created by Freeze)
in Freeze (created by DelayedFreeze)
in DelayedFreeze (created by InnerScreen)
in InnerScreen (created by Screen)
in Screen (created by MaybeScreen)
in MaybeScreen (created by CardStack)
in RNSScreenContainer (created by ScreenContainer)
in ScreenContainer (created by MaybeScreenContainer)
in MaybeScreenContainer (created by CardStack)
in RCTView (created by View)
in View (created by Background)
in Background (created by CardStack)
in CardStack (created by HeaderShownContext)
in RNCSafeAreaProvider (created by SafeAreaProvider)
in SafeAreaProvider (created by SafeAreaInsetsContext)
in SafeAreaProviderCompat (created by StackView)
in RCTView (created by View)
in View (created by GestureHandlerRootView)
in GestureHandlerRootView (created by StackView)
in StackView (created by StackNavigator)
in PreventRemoveProvider (created by NavigationContent)
in NavigationContent
in Unknown (created by StackNavigator)
in StackNavigator (created by AppNavigator)
in EnsureSingleNavigator
in BaseNavigationContainer
in ThemeProvider
in NavigationContainerInner (created by AppNavigator)
in RCTView (created by View)
in View (created by AppNavigator)
in AppNavigator (created by Connect(AppNavigator))
in Connect(AppNavigator) (created by App)
in Provider (created by App)
in App (created by withDevTools(App))
in withDevTools(App)
in RCTView (created by View)
in View (created by AppContainer)
in RCTView (created by View)
in View (created by AppContainer)
in AppContainer
in main(RootComponent), js engine: hermes
Das Problem ist, dass die Expo-Mitinstallierte Version des Packages sich offensichtlich von der offiziellen Version unterscheidet. In dem Fall ist die Bibliothek React Navigation auch von dem Package abhängig und kommt mit der Expo-Version nicht klar.
LÖSUNG:
Unter node_modules den Ordner react-native-gesture-handler löschen und mit bspw. Yarn als Dependency hinzufügen:
In der EAS – Konfiguration eas.json im Projektverzeichnis werden grundlegend die Channels und deren Eigenschaften festgelegt. Es werden die Profile „stage“ und „production“ festgelegt und welchen Channels diese zuzuordnen sind. (Bspw. stage gehört zum Channel staging)
Wenn man nun ein Release in der EAS-Cloud bauen lässt, wird dieses automatisch dem jeweiligen Channel zugeordnet.
Man kann Branches anlegen, diese einem Channel zuweisen, wiederum Updates einspielen und diese einem Branch zuweisen. (Kette)
Somit ist man in der Lage einen Build, bspw. Production schnell auf einen vorigen Branch zurückzustellen.
Updates werden über den Branch in den zugewiesen Channels übertragen und OHNE neues Release im Store sofort per Over The Air Update ausgerollt. Nutzer bekommen dieses Update automatisch ausgeliefert.
Für das Upgrade eines bestehenden Projektes sollte man folgendem Guide folgen ExpoBlog
Wenn man die ReactNavigation implementiert hat, muss man die Bibliothek react-native-gesture-handler entfernen, da Expo diese selbst integriert hat und sonst mit folgender Fehlermeldung quittiert:
Tried to register two views with the same name RNGestureHandlerButtonCode-Sprache:JavaScript(javascript)
Deshalb folgende Vorgehensweise:
Alle laufenden Instanzen der App schließen
node_modules – Ordner löschen
package-lock.json löschen
react-native-gesture-handler aus package.json entfernen
Install patch-package, this will later be used to make the changes more persistent.
Install deprecated-react-native-prop-types by running npm install deprecated-react-native-prop-types or yarn add deprecated-react-native-prop-types
Now you have to hack the node_modules. Go to node_modules/react-native/index.js starting around line 436 and change this:
// Deprecated Prop Typesget ColorPropType(): $FlowFixMe {
invariant(
false,
"ColorPropType has been removed from React Native. Migrate to " +
"ColorPropType exported from 'deprecated-react-native-prop-types'.",
);
},
get EdgeInsetsPropType(): $FlowFixMe {
invariant(
false,
"EdgeInsetsPropType has been removed from React Native. Migrate to " +
"EdgeInsetsPropType exported from 'deprecated-react-native-prop-types'.",
);
},
get PointPropType(): $FlowFixMe {
invariant(
false,
"PointPropType has been removed from React Native. Migrate to " +
"PointPropType exported from 'deprecated-react-native-prop-types'.",
);
},
get ViewPropTypes(): $FlowFixMe {
invariant(
false,
"ViewPropTypes has been removed from React Native. Migrate to " +
"ViewPropTypes exported from 'deprecated-react-native-prop-types'.",
);
},Code-Sprache:JavaScript(javascript)
to this:
// Deprecated Prop Typesget ColorPropType(): $FlowFixMe {
returnrequire("deprecated-react-native-prop-types").ColorPropType
},
get EdgeInsetsPropType(): $FlowFixMe {
returnrequire("deprecated-react-native-prop-types").EdgeInsetsPropType
},
get PointPropType(): $FlowFixMe {
returnrequire("deprecated-react-native-prop-types").PointPropType
},
get ViewPropTypes(): $FlowFixMe {
returnrequire("deprecated-react-native-prop-types").ViewPropTypes
},
Code-Sprache:JavaScript(javascript)
Run npx patch-package react-native to save the patch.
Rebuild the app.
Only thing to keep in mind is that this patch will need to be reapplied with every upgrade to react-native, or until the libraries in question are updated to import from deprecated-react-native-prop-types instead.
Um dir ein optimales Erlebnis zu bieten, verwenden wir Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wenn du diesen Technologien zustimmst, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn du deine Zustimmung nicht erteilst oder zurückziehst, können bestimmte Merkmale und Funktionen beeinträchtigt werden.
Funktional
Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt.Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.