Ekran Oryantasyonu Değişiminde Veri Kaybı: Lifecycle ve SaveState
Ekran oryantasyonu değiştiğinde (yatay/dikey), Android varsayılan olarak Activity'yi yeniden oluşturur. Bu sırada state verileriniz kaybolur. Flutter'da benzer şekilde widget ağacı yeniden inşa edilir. Bundan korunmak için lifecycle'ı anlamak ve SavedStateHandle ya da ViewModel stratejisi kullanmak gerekir.
Kullanıcı bir form dolduruyorsa veya API'den veri yüklüyorsa, telefonu döndürdüğünde:
- Widget state sıfırlanır
- Yazılan metin silinir
- Yüklenen liste boşalır
- API isteği baştan başlar
Flutter'da `provider` ve `riverpod` paketleri state'i otomatik olarak korur. Aşağıda `riverpod` ile praktik örnek:
1import 'package:flutter/material.dart';2import 'package:flutter_riverpod/flutter_riverpod.dart';34// State provider'ı tanımla5final userNameProvider = StateNotifierProvider<UserNameNotifier, String>(6(ref) => UserNameNotifier(),7);89class UserNameNotifier extends StateNotifier<String> {10UserNameNotifier(): super('');1112void setName(String name) {13state = name; // State güncellenir ve saklanır14}15}1617void main() => runApp(const ProviderScope(child: MyApp()));1819class MyApp extends ConsumerWidget {20const MyApp({Key? key}): super(key: key);2123Widget build(BuildContext context, WidgetRef ref) {24final userName = ref.watch(userNameProvider);2526return MaterialApp(27home: Scaffold(28appBar: AppBar(title: const Text('Oryantasyon Testi')),29body: Column(30children: [31TextField(32onChanged: (value) {33ref.read(userNameProvider.notifier).setName(value);34},35decoration: const InputDecoration(hintText: 'Adını gir'),36),37Text('Merhaba, $userName!'),38],39),40),41);42}43}Çıktı: Telefonu döndürüp yeniden oryantasyon yapsanız bile, `userName` değişkeni korunur ve metin silinmez.
1. Pubspec.yaml'a ekle: `flutter_riverpod` paketini dependencies'ye koy
2. Provider tanımla: State'i tutacak provider oluştur
3. ConsumerWidget kullan: Riverpod'u dinlemek için ConsumerWidget'a geç
4. ref.watch() ile izle: State değişimlerini otomatik güncelle
Native Android'de ise `onSaveInstanceState()` callback'ini override ederek Bundle'a veri yazarız, `onCreate()` içinde geri alırız. Flutter'da bu işi provider kütüphaneleri otomatik yapar.
Hızlı kural: Stateless widget + provider = oryantasyon güvenli. StatefulWidget sadece UI = riskli.
0 yorum