flutter-ve-riverpod-ile-modern-durum-yonetimi

Flutter ve Riverpod ile Modern Durum Yönetimi

İçindekiler

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<User>((ref) {
  // Compile error - no context available
  return Provider.of<AuthService>(context).user;
});

				
			
Riverpod’un Çözümü
				
					dart
// Riverpod ile çözüm
final authServiceProvider = Provider<AuthService>((ref) => AuthService());

final userProvider = Provider<User>((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<List<int>> board;
  final int score;
  final bool isComplete;

  const GameState({
    required this.board,
    required this.score,
    this.isComplete = false,
  });

  GameState copyWith({
    List<List<int>>? 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<GameStateNotifier, GameState>((ref) {
  return GameStateNotifier();
});

class GameStateNotifier extends StateNotifier<GameState> {
  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<TodoList, List<Todo>>((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<Todo, String>((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.

Kaynaklar

Twitter
LinkedIn
Diğer Yazılar
İletişim

Chipode Uygulamaları

loading...
Google Play Store
loading...
Apple Store