Modern mobil uygulama geliştirmede state management (durum yönetimi), uygulamanın belkemiğini oluşturur. Özellikle Flutter ekosisteminde, doğru state management yaklaşımı seçimi, uygulamanın başarısını doğrudan etkiler. Bu yazımızda, neden Riverpod’u tercih ettiğimizi ve Provider’a göre avantajlarını detaylıca inceleyeceğiz.
Riverpod Nedir?
Riverpod, Flutter’ın yaratıcısı olan Google’ın önerdiği Provider paketinin yeniden tasarlanmış halidir. Provider’ın karşılaştığı bazı temel sorunları çözmek için geliştirilmiştir. Adı bile Provider kelimesinin bir anagramıdır!
Riverpod'un Temel Avantajları
1. Compile-time safety
2. Bağımlılıkların otomatik dispose edilmesi
3. Global state erişimi için context gerekmemesi
4. Daha kolay test edilebilirlik
5. Autowiring özelliği
Provider vs Riverpod: Temel Farklar
Provider’ın Sınırlamaları
dart
// Provider ile yaşanan tipik sorun
final userProvider = Provider((ref) {
// Compile error - no context available
return Provider.of(context).user;
});
Riverpod’un Çözümü
dart
// Riverpod ile çözüm
final authServiceProvider = Provider((ref) => AuthService());
final userProvider = Provider((ref) {
// Sorunsuz çalışır!
return ref.watch(authServiceProvider).user;
});
Riverpod ile State Management Best Practices
1. State Immutability
State’in değişmezliği, uygulamanın tahmin edilebilirliğini artırır ve hataları azaltır:
dart
@immutable
class GameState {
final List> board;
final int score;
final bool isComplete;
const GameState({
required this.board,
required this.score,
this.isComplete = false,
});
GameState copyWith({
List>? board,
int? score,
bool? isComplete,
}) {
return GameState(
board: board ?? this.board,
score: score ?? this.score,
isComplete: isComplete ?? this.isComplete,
);
}
}
2. State Notifiers Kullanımı
dart
final gameStateNotifierProvider = StateNotifierProvider((ref) {
return GameStateNotifier();
});
class GameStateNotifier extends StateNotifier {
GameStateNotifier() : super(GameState(
board: List.generate(9, (_) => List.filled(9, 0)),
score: 0,
));
void updateCell(int row, int col, int value) {
final newBoard = state.board.map((list) => [...list]).toList();
newBoard[row][col] = value;
state = state.copyWith(
board: newBoard,
score: calculateScore(newBoard),
);
}
// Oyun mantığı methodları
void startNewGame() {
state = GameState(
board: generateNewBoard(),
score: 0,
);
}
void checkCompletion() {
final isComplete = validateBoard(state.board);
if (isComplete) {
state = state.copyWith(isComplete: true);
}
}
}
Performance Optimizasyonu
Riverpod ile performans optimizasyonu için önemli teknikler:
1. Select Kullanımı
dart
final todoListProvider = StateNotifierProvider>((ref) => TodoList());
// Sadece tamamlanmış todoları dinle
final completedTodosCount = todoListProvider.select(
(todos) => todos.where((todo) => todo.completed).length,
);
2. Family Modifier
dart
final todoProvider = FutureProvider.family((ref, id) async {
return await ref.read(todoRepositoryProvider).fetchTodo(id);
});
// Kullanımı
final todo = ref.watch(todoProvider('123'));
Riverpod Hooks ile Genişletilmiş Kullanım
Flutter Hooks ve Riverpod’un birleşimi ile daha güçlü bir yapı elde edebilirsiniz:
dart
class GameScreen extends HookConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final gameState = ref.watch(gameStateNotifierProvider);
final timer = useTimer(const Duration(seconds: 1), repeating: true);
useEffect(() {
timer.start();
return timer.stop;
}, []);
return Column(
children: [
Text('Süre: ${timer.tick}'),
// Oyun tahtası widget'ları
],
);
}
}
Testing
Riverpod’un test edilebilirliği oldukça güçlüdür:
dart
void main() {
test('GameState updates correctly', () {
final container = ProviderContainer();
addTearDown(container.dispose);
final notifier = container.read(gameStateNotifierProvider.notifier);
notifier.updateCell(0, 0, 5);
expect(
container.read(gameStateNotifierProvider).board[0][0],
equals(5),
);
});
}
Sonuç
Riverpod, modern Flutter uygulamaları için güçlü ve güvenilir bir state management çözümüdür. Compile-time safety, kolay test edilebilirlik ve temiz kod yapısı gibi avantajları ile öne çıkar. Chipode’da Sudoku uygulamamızda Riverpod’u tercih etmemizin ana sebebi de bu özelliklerdir.





