Du stehst wahrscheinlich vor einer von zwei Situationen. Entweder übergibt dir ein Designer eine Lottie-JSON-Datei und fragt: „Können wir das noch heute in die App bekommen?“, oder du hast es bereits integriert und festgestellt, dass die Animation in der Entwicklung läuft, aber auf echten Geräten, bei der Startzeit und in Release-Builds schnell teuer wird.
Genau hier wird Lottie React Native interessant. Die Basis-Demo ist einfach. Eine produktionsreife Implementierung nicht. Der Unterschied liegt meist darin, wie du es installierst, wie du die Wiedergabe steuerst und ob du Animationsdateien als harmlose Assets behandelst oder als Teil deines Performance-Budgets.
Inhaltsverzeichnis
- Warum Lottie essenziell für React Native Apps ist
- Deine Lottie-Entwicklungsumgebung einrichten
- Deine erste Lottie-Animation anzeigen
- Lottie-Animation-Controls meistern
- Performance-Tuning für Production-Apps
- Häufige Lottie-Probleme lösen
Warum Lottie essenziell für React Native Apps ist
Wer schon einmal versucht hat, eine hochwertige Produktanimation manuell in React Native nachzubauen, kennt den Schmerz. Kleine Details in der Bewegung verwandeln sich in einen Berg aus Timing-Logik, Interpolationen und Plattform-Eigenheiten. Die Animation mag ähnlich aussehen, aber „ähnlich“ ist meistens nicht das, was das Design vorgibt.
Lottie hat diesen Workflow verändert. Airbnb hat Lottie 2016 Open Source gestellt, und dieser Release hat mobile Animationen verändert, indem Designer Animationen direkt ausliefern konnten, statt dass Engineers sie Frame für Frame nachbauen mussten. In einigen Enterprise-Umgebungen senkte dieser Wandel die Entwicklungskosten für mobile Apps um bis zu 40 %komprimieren können, laut Lottie-Übersicht von Airbnb.
Design und Engineering führen nicht mehr denselben Kampf
Ein wesentlicher Vorteil von Lottie React Native liegt nicht nur in „schönen Animationen in JSON“. Es ist die Trennung der Zuständigkeiten. Designer arbeiten in After Effects und exportieren mit Bodymovin. Entwickler rendern die Ausgabe mit nativem Playback, statt Bewegung in eigenen code umzusetzen.
Das ist wichtig, weil Animationsarbeit dazu neigt, sich auszubreiten. Eine einzelne Feier-Animation kann Design-Review, Produkt-Review, Android-Verhalten, iOS-Verhalten, Barrierefreiheit und Startperformance betreffen. Lottie verkleinert diese Oberfläche.
Praktische Regel: Nutze Lottie, wenn die Animation Teil des Produkt-Erlebnisses ist, nicht wenn du nur eine einfache Opacity- oder Translate-Übergang brauchst.
Es gibt auch einen UX-Aspekt. Bewegung gibt Feedback, bestätigt Aktionen und lässt Ladezustände weniger tot wirken. Wenn dein Team ernsthaft über Polish, Retention oder Vertrauen in die Oberfläche nachdenkt, ist Animation Teil dieser Diskussion. Die breitere Diskussion über das App-User-Experience endet meist am selben Ort: schnelles Feedback schlägt statische Screens.
Wo Lottie am besten passt
Lottie React Native funktioniert am besten für:
- Branded Micro-Interactions wie Likes, Saves, Häkchen und Kauf-Erfolgszustände
- Onboarding-Illustrationen die sich individuell anfühlen sollen, ohne Video zu shippen
- Loading- und Empty-States in denen statische UI unvollständig wirkt
- Feature-Erklärung wenn das Produkt Motion will, ohne GIFs oder MP4s einzubetten
Was es nicht löst, ist jedes Animationsproblem. Für einfache Screen-Transitions sind die eigenen Animationstools von React Native oft einfacher. Für sehr große oder hochinteraktive Motion-Systeme kann das JSON-Format zum Trade-off statt zum Vorteil werden. Dieser Trade-off wird wichtiger, sobald man in Produktion geht – genau dort hören die meisten Tutorials zu früh auf.
Deine Lottie-Entwicklungsumgebung einrichten
Der Installationspfad hängt zunächst von einer Entscheidung ab: Expo Managed Workflow oder Bare React Native. Verwechselt die Mental Models nicht. Die meisten Setup-Probleme entstehen, wenn Entwickler in Expo einem Bare-Workflow-Guide folgen oder annehmen, Expo abstrahiere jedes native Detail.

Wähle den Workflow, bevor du installierst
Wenn deine App in Expo läuft und du das schnellste Setup willst, bleib auf dem Expo-Pfad, es sei denn, du weißt, dass du Custom Native Work brauchst. Wenn du eine Bare App nutzt oder bereits auf Native Modules angewiesen bist, die direkte Kontrolle erfordern, installiere es als normale native Abhängigkeit und validiere sofort beide Builds für iOS und Android.
Viele Teams unterschätzen, wie viel einfacher das Debugging wird, wenn das Setup zum Projekttyp passt. Deshalb vergleichen viele Teams, die Custom Native Integrations bauen, Capgo als Alternative zu Expo EAS früh, anstatt zu warten, bis die App schwerer zu ändern ist.
Expo Managed Setup
Für Expo-gemanagte Apps: Halte es minimal.
-
Paket installieren
npx expo install lottie-react-native -
Metro neu starten
npx expo start -c -
Auf dem Gerät oder Simulator testen Beginne mit einer lokalen JSON-Datei und rendere zuerst eine sehr kleine Animation. Debugge nicht gleichzeitig ein großes Asset und eine Neuinstallation.
Ein paar praktische Hinweise für Expo:
- Nutze zuerst lokale Dateien: Das Debuggen von Remote-Animationen erzeugt Netzwerk-Rauschen, wenn du eigentlich nur prüfen willst, ob die Library funktioniert.
- Release-Verhalten früh testen: Der Development-Modus kann Probleme bei Timing und Performance verbergen.
- Asset-Pfade prüfen: Falsch platzierte JSON-Dateien sind eine der häufigsten Ursachen für „es rendert nichts“.
Expo ist der schnellste Weg zu „es funktioniert“. Das bedeutet aber nicht, dass es der schnellste Weg zu „es skaliert“ ist.
Bare React Native Setup
Installiere und validiere in einem Bare-Projekt sofort die native Dependencies.
-
Paket installieren
npm install lottie-react-native -
iOS Pods installieren
cd ios && pod install && cd .. -
App neu bauen
npx react-native run-iosoder
npx react-native run-android
Hier ist der Punkt, den viele Quick-Start-Guides überspringen: Führe nach der Installation einen vollständigen nativen Rebuild durch, bevor du annimmst, dass etwas kaputt ist. Hot Reload kann eine native Dependency nicht retten, die nicht korrekt in die App kompiliert wurde.
Bare Workflow-Checks, die Zeit sparen
Nutze diese kurze Checkliste, bevor du weitermachst:
| Prüfen | Warum das wichtig ist |
|---|---|
| Neu kompilieren nach Installation | Native Module erfordern eine frische Kompilierung |
Ausführen pod install |
Ohne das ist iOS nicht zuverlässig |
| Zuerst eine einfache lokale JSON-Datei verwenden | Trennt Installationsprobleme von Asset-Problemen |
| Teste beide Plattformen früh | Android und iOS können aus unterschiedlichen Gründen fehlschlagen |
Wenn das Paket sauber installiert wird, aber deine erste Animation nicht angezeigt wird, liegt es in der Regel nicht an der Installation. Meistens ist es der Asset-Pfad, die Komponentengröße oder die Wiedergabekonfiguration.
Deine erste Lottie-Animation anzeigen
Die erste funktionierende Animation sollte langweilig sein. Lokale Datei. Feste Größe. Autoplay an. Loop optional. Fang nicht mit bedingter Wiedergabe, Remote-JSON oder einem Animationsexport mit vielen Ebenen an.

Eine lokale Animationsdatei hinzufügen
Lege einen Asset-Ordner an, falls du noch keinen hast:
assets/
animations/
success.json
Halte die Namen einfach. Vermeide Leerzeichen, ungewöhnliche Satzzeichen und Ordner mit vielen Verschachtelungsebenen. Du willst, dass die require() Pfade klar bleiben.
Wenn du Lottie für einen anfänglichen gebrandeten Ladebildschirm oder die Übergabe nach dem Start nutzt, denk genau darüber nach, bevor du eine große Animation in den Startpfad packst. Das gilt besonders, wenn du gleichzeitig dein React Native Splash-Screen-Verhalten.
Rendere es mit LottieView
Erstelle eine eigene Komponente, statt es direkt in eine große Screen-Datei zu packen:
import React from 'react';
import { View, StyleSheet } from 'react-native';
import LottieView from 'lottie-react-native';
export function SuccessAnimation() {
return (
<View style={styles.container}>
<LottieView
source={require('../assets/animations/success.json')}
autoPlay
loop={false}
style={styles.animation}
/>
</View>
);
}
const styles = StyleSheet.create({
container: {
alignItems: 'center',
justifyContent: 'center',
},
animation: {
width: 220,
height: 220,
},
});
Das bringt drei nützliche Dinge:
- Es beweist, dass die Bibliothek korrekt rendert.
- es beweist, dass der Asset-Pfad korrekt aufgelöst wird
- es gibt dir einen isolierten Ort, um Wiedergabe und Größe später anzupassen
Ein paar Stolperfallen zeigen sich sofort, wenn du die Basics überspringst:
- Keine Breite oder Höhe: Die Animation kann existieren, aber unsichtbar sein.
- Falsch
require()Pfad: Metro findet die Datei nicht. - Ungültiger Export: Einige JSON-Dateien sind technisch gültig, enthalten aber Features, die auf Mobile nicht wie erwartet funktionieren.
Halte den ersten Render lokal und deterministisch. Du testest die Integration, nicht die Architektur.
Ein besserer Test für den ersten Screen
Platziere die Komponente auf einem einfachen Screen mit neutralem Hintergrund:
import React from 'react';
import { SafeAreaView, StyleSheet } from 'react-native';
import { SuccessAnimation } from './src/SuccessAnimation';
export default function App() {
return (
<SafeAreaView style={styles.screen}>
<SuccessAnimation />
</SafeAreaView>
);
}
const styles = StyleSheet.create({
screen: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#fff',
},
});
Wenn das in beiden Simulatoren (iOS und Android) funktioniert, hast du die erste echte Hürde genommen. Der nächste Schritt ist nicht, weitere Animationen hinzuzufügen. Es geht darum zu lernen, wann du deklarative Props nutzt und wann du mit Refs die direkte Kontrolle übernimmst.
Lottie-Animation-Controls meistern
Die meisten Lottie React Native Bugs treten auf, wenn die Animation auf State reagieren muss. Autoplay ist einfach. „Dieses Segment abspielen, wenn der Nutzer einen Artikel liked, rückwärts abspielen, wenn er ihn unliked, und nicht stottern, wenn die Komponente neu gerendert wird“ – da wird es unübersichtlich.

Props nutzen bei einfacher Wiedergabe
Für nicht-interaktive Wiedergabe reichen Props aus.
<LottieView
source={require('../assets/animations/loading.json')}
autoPlay
loop
speed={1}
/>
Dieser Stil eignet sich für:
- Ladeindikatoren
- passive Onboarding-Illustrationen
- dekorative Empty States
Es ist deklarativ und lesbar. Die Komponente wird gemountet, die Wiedergabe startet und React behält die Kontrolle. Wenn die Animationslogik rein über Props beschrieben werden kann, bleib dabei.
Ein fortgeschrittener deklarativer Fall ist progress, wenn du den Animationsframe an einen anderen Wert koppelst. Das funktioniert gut, wenn die Bewegung eine externe Fortschrittsquelle widerspiegeln soll, ist aber für einmalige Trigger-Events weniger praktisch.
Hier ist ein kurzer visueller Vergleich, bevor wir zu Refs übergehen:
Refs nutzen, wenn State die Animation steuert
Wenn der User tippt, umschaltet oder eine Aktion abschließt, ist ein Ref meist das sicherere Tool. Praxisdaten zeigen: 68 % der Entwickler, die Hybrid-Frameworks nutzen, berichten von fehlgeschlagenen Animationstriggern durch fehlerhaftes Ref-Handling in useEffect Hooks, weshalb zuverlässige Patterns, die darauf aufbauen, animation.current.play() wichtig sind, wie in dieser Capacitor-fokussierte Diskussion zu fehlgeschlagenen Triggern.
Das Problem beschränkt sich nicht nur auf Hybrid-Apps. Es tritt auch in reinem React Native auf, besonders wenn Entwickler Refs neu erstellen, das Playback vor dem Mount triggern oder Animationsaufrufe an instabile Effects binden.
import React, { useRef, useState } from 'react';
import { Pressable } from 'react-native';
import LottieView from 'lottie-react-native';
export function LikeButton() {
const animationRef = useRef<LottieView>(null);
const [liked, setLiked] = useState(false);
const onPress = () => {
if (!animationRef.current) return;
if (liked) {
animationRef.current.play(60, 0);
} else {
animationRef.current.play(0, 60);
}
setLiked(!liked);
};
return (
<Pressable onPress={onPress}>
<LottieView
ref={animationRef}
source={require('../assets/animations/like.json')}
loop={false}
autoPlay={false}
style={{ width: 96, height: 96 }}
/>
</Pressable>
);
}
Ein zuverlässiges Like/Unlike-Pattern
Dieses Pattern ist in der Produktion deutlich stabiler als das Aufrufen play() innerhalb useEffect bei jeder State-Änderung.
Warum es funktioniert:
- Das Event steuert den Animationstrigger: Ein Press-Event ist ein stabiler Zeitpunkt für den Playback-Start.
- Die Ref bleibt lokal und persistent:
useRefvermeidet unnötige Rerenders. - Die Komponente vermeidet Autoplay-Konflikte: Das Mount-Verhalten sollte nicht mit benutzergesteuerten Aktionen kollidieren.
Häufige Fehler, die man vermeiden sollte:
-
Auslösen, bevor die Ref existiert
WennanimationRef.currentist null, die Wiedergabe findet nicht statt. Prüfe das. -
Verwendung
autoPlaymit imperativen Controls
Wähle einen Standard-Owner für die Wiedergabe. -
Driving everything through
useEffect
Effekte sind nützlich, aber bei UI-Aktionen verursachen sie oft Timing-Probleme, statt sie zu lösen.
Wenn eine Animation auf einen Tap reagiert, trigger sie zuerst im Tap-Handler. Nutze sie
useEffectnur dann, wenn die Source of Truth außerhalb dieser Interaktion liegt.
Performance-Tuning für Production-Apps
Lottie React Native ist eine dieser Libraries, die leichtgewichtig wirken, bis Teams riesige JSON-Dateien in das App-Bundle packen und sich wundern, warum die Startup-Zeit schlechter wird. Die Animation selbst ist nicht immer das Problem. Die Delivery-Strategie ist es.

Wo Teams in Schwierigkeiten geraten
Der naheliegendste Fehler ist, jede Animation direkt in JavaScript zu bündeln und alles zu früh zu laden. Laut diesem Guide zum falschen Ausliefern von Lottie JSONs, kann das Überladen von JS-Bundles mit Assets wie Lottie JSONs die App-Startzeiten um 40 % oder mehr auf Mittelklassegeräten erhöhen., und sie als native Assets für das On-Demand-Loading bereitzustellen, ist eine entscheidende Optimierung.
Das deckt sich mit dem, was viele Teams in der Praxis beobachten. Das Problem ist nicht eine einzelne kleine Erfolgs-Animation. Es ist die Anhäufung:
- Onboarding-Animation
- Loader-Status
- E-Commerce-Reaktionen
- Branded Empty Screens
- Locale-Dateien und andere bundle-lastige Assets, die daneben liegen
Wenn deine App bereits ein Problem mit dem Startup-Budget hat, können Lottie-Dateien die Lage schnell verschlimmern.
Was man zuerst optimieren sollte
Beginne mit dem Export selbst. Ein schlampiger Animations-Export bringt Komplexität mit sich, die du später beim Parsen, im Speicher und bei der Render-Stabilität bezahlst. Nimm nicht jeden Designer-Export ungeprüft an.
Nutze diese Produktions-Checkliste:
- Komprimiere das JSON vor dem Versand: Kleinere Dateien laden leichter und bloaten das Startup weniger.
- Verschiebe nicht-kritische Animationen aus dem JS-Bundle: Halte den Launch code auf das beschränkt, was die App sofort braucht.
- Animationen bei Bedarf laden: Rendern, wenn der Screen oder die Aktion es benötigt.
- Verhalten auf älteren Geräten prüfen: Ein moderner Simulator kann aufwendige Wiedergabe verbergen.
- Große Lottie-Dateien nicht als Startdekor verwenden: Wenn es für die erste Interaktion nicht kritisch ist, sollte es nicht mit dem App-Start konkurrieren.
Für Teams, die ernsthaft an der mobilen Performance arbeiten, AppLighters Guide zur mobilen Performance ist eine nützliche Ergänzung, da sie die Entscheidungen zur Animation in den größeren Kontext von App-Start, Rendering und Framework-Abwägungen einordnet.
Eine harte Wahrheit: Eine schöne Animation, die die erste Interaktion verzögert, ist in der Regel ein Produkt-Bug, kein Design-Sieg.
Man sollte auch über React Native isoliert hinausdenken. Teams, die in hybriden Stacks arbeiten, stoßen auf ähnliche Asset-Loading-Probleme, und der breitere Leitfaden zur Animationsperformance für Capacitor-Apps passt auch gut zu Lottie-Entscheidungen.
Lokale Dateien vs. Remote-Auslieferung
Lokale Dateien sind vorhersehbar. Sie funktionieren offline, eliminieren Netzwerk-Schwankungen und sind leichter zu testen. Allerdings ist es leicht, zu viel zu bündeln.
Remote-Delivery hält das Binary schlanker, bringt aber Verfügbarkeits-, Caching- und Fallback-Fragen mit sich. Dieser Trade-off ist für nicht-kritische Motion akzeptabel. Für primäre UX-Zustände wie Kaufbestätigung oder Authentifizierungserfolg ist er riskant.
Eine praktische Aufteilung funktioniert gut:
| Asset-Typ | Bessere Standardwahl |
|---|---|
| Kern-Interaktionsanimation | Lokal, optimiert, nicht zu groß |
| Gelegentliche Promo-Motion | Remote mit Fallback |
| Startbildschirm-Animation | Nur lokal, wenn es unbedingt nötig ist |
| Illustration für selten genutzte Funktionen | Laden bei Bedarf |
Wenn du nur eine Regel aus diesem Abschnitt befolgst, dann diese: behandle Lottie-JSONs als performancekritische Assets, nicht als harmlose Dekoration.
Häufige Lottie-Probleme lösen
Wenn Lottie Probleme macht, ist die Ursache meist banal: falscher Pfad, fehlende Größe, schlechtes Ref-Timing, zu fette JSON. Am schnellsten debuggst du, indem du die Variablen reduzierst.
Animation wird auf Android nicht gerendert
Prüfe zuerst, ob die JSON-Datei aufgelöst wird. Gib der Komponente danach explizite Dimensionen.
<LottieView
source={require('../assets/animations/success.json')}
autoPlay
style={{ width: 200, height: 200 }}
/>
Falls das immer noch fehlschlägt, teste eine andere, funktionierende Animation. So findest du heraus, ob das Problem an der Datei oder am Setup liegt.
Playback ruckelt auf älteren Geräten
Das deutet meist auf das Asset hin, nicht auf die Komponente API.
Versuche diese Fixes:
- Reduziere die Komplexität der Animation: Fordere einen leichteren Export an, wenn die Quelldatei zu groß ist.
- Später laden: Nicht mit dem Initial-Screen konkurrieren.
- Eine komprimierte Version testen: Läuft die komprimierte Datei besser, hast du den Engpass gefunden.
- Mehrere gleichzeitige Lottie-Views entfernen: Mehrere Animationen auf einem Screen können zu viel sein.
Ref ist null oder play macht nichts
Null-Refs heißen meist, der Trigger feuert vor dem Mount oder die Komponente wurde bedingt entfernt.
if (animationRef.current) {
animationRef.current.play();
}
Halte die Ref stabil mit useRef, und erstelle die animierte Komponente nicht unnötig neu. Wenn du wiederkehrende seltsame Fehler in lokalen Builds debuggst, kann das Leeren veralteter Caches helfen. Ein einfaches Yarn-Cache-Aufräumroutine reicht manchmal aus, um irreführendes Asset-Verhalten während der Entwicklung zu beseitigen.
Animation sieht auf verschiedenen Displaygrößen falsch aus
Lass die Animation das Layout nicht bestimmen. Platziere sie in einem Container und bestimme die Größe bewusst.
- Nutze feste Grenzen für Icons und Reaktionen
- Nutze aspect-ratio-bewusste Wrapper für größere Illustrationen
- Vermeide das Dehnen auf volle Breite, ohne die beabsichtigte Komposition des Exports zu prüfen
Die meisten „Lottie ist kaputt“-Meldungen erweisen sich am Ende als Layout-, Asset- oder Timing-Probleme. Die Bibliothek tut oft genau das, was du von ihr verlangt hast.
Wenn du einen letzten Debugging-Shortcut brauchst, entferne alle fortgeschrittenen Props, rendere eine lokale Animation in einer zentrierten View und baue von dort aus wieder auf. Dieser Ansatz isoliert Probleme schneller, als auf einem überfüllten Production-Screen zu starren.
Capgo hilft Teams, JavaScript-, Asset- und Config-Fixes an Capacitor-Apps zu shippen, ohne auf die Store-Review zu warten. Wenn du eine Hybrid-App pflegst und eine sicherere Möglichkeit brauchst, Updates zu pushen, gestaffelte Rollouts zu handhaben und dich schnell von Frontend-Problemen zu erholen, Capgo lohnt einen Blick.