AsyncStorage-Komponente in React Native
AsyncStorage-Komponente
~13 Min. Lesezeit Zuletzt aktualisiert am 8. August 2026
AsyncStorage ist React Natives einfacher, dauerhafter Schlüssel-Wert-Speicher auf dem Gerät – das Gegenstück zu localStorage im Browser, nur asynchron.
1. Beschreibung
AsyncStorage (aus dem separat installierten Paket @react-native-async-storage/async-storage) speichert Zeichenketten dauerhaft auf dem Gerät – die Daten überleben App-Neustarts und sogar Geräte-Neustarts. Alle Methoden geben ein Promise zurück, da echter Speicherzugriff auf dem Gerät nicht blockierend sein darf.
2. Kurzes Beispiel
import AsyncStorage from '@react-native-async-storage/async-storage';
await AsyncStorage.setItem('benutzername', 'anna92');
const wert = await AsyncStorage.getItem('benutzername');
console.log(wert); // 'anna92'3. Komplettes Projekt: Notiz-App mit dauerhafter Speicherung
npx create-expo-app asyncstorage-demo
cd asyncstorage-demo
npx expo install @react-native-async-storage/async-storageimport { useEffect, useState } from 'react';
import {
View,
Text,
TextInput,
FlatList,
TouchableOpacity,
StyleSheet,
} from 'react-native';
import AsyncStorage from '@react-native-async-storage/async-storage';
const SPEICHER_SCHLUESSEL = 'meine-notizen';
export default function App() {
const [notizen, setNotizen] = useState([]);
const [eingabe, setEingabe] = useState('');
const [ladend, setLadend] = useState(true);
// Beim Start: gespeicherte Notizen laden
useEffect(() => {
async function laden() {
try {
const gespeichert = await AsyncStorage.getItem(SPEICHER_SCHLUESSEL);
if (gespeichert !== null) {
setNotizen(JSON.parse(gespeichert));
}
} catch (error) {
console.error('Fehler beim Laden:', error);
} finally {
setLadend(false);
}
}
laden();
}, []);
async function notizHinzufuegen() {
if (eingabe.trim() === '') return;
const neueNotizen = [...notizen, { id: Date.now().toString(), text: eingabe }];
setNotizen(neueNotizen);
setEingabe('');
await AsyncStorage.setItem(SPEICHER_SCHLUESSEL, JSON.stringify(neueNotizen));
}
async function notizLoeschen(id) {
const neueNotizen = notizen.filter((n) => n.id !== id);
setNotizen(neueNotizen);
await AsyncStorage.setItem(SPEICHER_SCHLUESSEL, JSON.stringify(neueNotizen));
}
async function allesLoeschen() {
setNotizen([]);
await AsyncStorage.removeItem(SPEICHER_SCHLUESSEL);
}
if (ladend) {
return <Text style={styles.status}>Lade Notizen...</Text>;
}
return (
<View style={styles.container}>
<Text style={styles.titel}>Meine Notizen ({notizen.length})</Text>
<View style={styles.eingabeZeile}>
<TextInput
style={styles.input}
placeholder="Neue Notiz..."
value={eingabe}
onChangeText={setEingabe}
/>
<TouchableOpacity style={styles.addButton} onPress={notizHinzufuegen}>
<Text style={styles.addButtonText}>+</Text>
</TouchableOpacity>
</View>
<FlatList
data={notizen}
keyExtractor={(item) => item.id}
renderItem={({ item }) => (
<View style={styles.notizZeile}>
<Text style={styles.notizText}>{item.text}</Text>
<TouchableOpacity onPress={() => notizLoeschen(item.id)}>
<Text style={styles.loeschen}>✕</Text>
</TouchableOpacity>
</View>
)}
ListEmptyComponent={<Text style={styles.status}>Noch keine Notizen.</Text>}
/>
{notizen.length > 0 && (
<TouchableOpacity onPress={allesLoeschen}>
<Text style={styles.allesLoeschen}>Alle löschen</Text>
</TouchableOpacity>
)}
</View>
);
}
const styles = StyleSheet.create({
container: { flex: 1, paddingTop: 60, paddingHorizontal: 16 },
titel: { fontSize: 22, fontWeight: 'bold', marginBottom: 16 },
status: { textAlign: 'center', marginTop: 24, color: '#6b7280' },
eingabeZeile: { flexDirection: 'row', marginBottom: 16 },
input: { flex: 1, borderWidth: 1, borderColor: '#d1d5db', borderRadius: 8, padding: 10 },
addButton: { marginLeft: 8, backgroundColor: '#2563eb', borderRadius: 8, paddingHorizontal: 18, justifyContent: 'center' },
addButtonText: { color: '#fff', fontSize: 20 },
notizZeile: { flexDirection: 'row', justifyContent: 'space-between', paddingVertical: 12, borderBottomWidth: 1, borderBottomColor: '#e5e7eb' },
notizText: { flex: 1 },
loeschen: { color: '#ef4444', marginLeft: 12 },
allesLoeschen: { textAlign: 'center', color: '#ef4444', marginTop: 16 },
});4. Erklärung: jede verwendete Funktion
AsyncStorage.getItem(schluessel)– lädt den gespeicherten Wert zu einem Schlüssel als Promise; gibtnullzurück, falls noch nichts gespeichert wurde (NICHT einen Fehler).AsyncStorage.setItem(schluessel, wert)– speichert einen STRING dauerhaft; komplexe Daten (Arrays, Objekte) müssen vorher mitJSON.stringify()in einen String umgewandelt werden.AsyncStorage.removeItem(schluessel)– löscht einen einzelnen gespeicherten Wert vollständig.JSON.parse(gespeichert)– wandelt den geladenen String zurück in ein echtes JavaScript-Array/-Objekt.Date.now().toString()– eine einfache, hinreichend eindeutige ID für jede neue Notiz, genutzt alskeyin derFlatList.- Jede Änderung (Hinzufügen, Löschen) aktualisiert ERST den React-State (
setNotizen, für sofortige Anzeige) und speichert DANACH perAsyncStorage.setItem()– beide Schritte gehören immer zusammen, sonst driften Anzeige und Speicher auseinander.
5. Ausgaben
AsyncStorage.Achtung: AsyncStorage ist NICHT verschlüsselt und nicht für sensible Daten wie Passwörter gedacht – dafür gibt es expo-secure-store, das die verschlüsselten System-Schlüsselspeicher von iOS (Keychain) und Android (Keystore) nutzt.
Tipp: Weitere nützliche AsyncStorage-Methoden über setItem/getItem/removeItem hinaus: AsyncStorage.getAllKeys() (alle gespeicherten Schlüssel auflisten), AsyncStorage.multiGet([...])/multiSet([...]) (mehrere Werte in einem Rutsch lesen/schreiben, effizienter als viele einzelne Aufrufe), und AsyncStorage.clear() (WIRKLICH ALLES löschen, mit Vorsicht zu verwenden).