Flutter’da Cubit ve Bloc Yapıları: Temel Farklar ve Bir Sayaç Uygulaması

Learn when to automate, when to delegate, and how to get the best of both worlds.

Emirhan Soylu

22 Nis 2025

gprc API
gprc API

Flutter’da uygulama yazarken uygulamamız karmaşık hale gelebilir. Bu durumda, büyük ve karmaşık uygulamaları yönetmek için bazı durum yönetimlerine (State Management) ihtiyaç duyarız. Bu makalede, Flutter’da Cubit ve Bloc yapılarını inceleyeceğiz ve her birinin ne olduğunu, nasıl çalıştığını ve bir sayaç uygulaması oluşturmak için nasıl kullanılabileceğini göstereceğiz.

Flutter BLoC kütüphanesi Google tarafından onaylanmış bir kütüphanedir ve uygulamalar içinde kullanılan en popüler durum yönetimleridir.

Bu iki yapıyı da kullanmak için ilk önce kütüphanemizi projemize eklememiz gerekiyor. IDE’mizin terminalini açıyoruz ve aşağıdaki kodu yazıyoruz.


$ flutter pub add flutter_bloc

Kütüphanenin yüklenip yüklenmediğini pubspec.yaml dosyasından kontrol edebilirsiniz.

dependencies:
  flutter_bloc: ^8.1.4

Flutter’da Cubit ve Bloc Yapıları

Flutter’da Cubit ve Bloc, uygulamanızın durumunu yönetmek için kullanılan iki popüler durum yönetimidir. Her ikisi de iş mantığını (business logic) ve kullanıcı arayüzünü (UI) birbirinden ayırır, böylece kodunuzu daha modüler ve test edilebilir hale getirir. Ancak, her ikisinin de bazı farklılıkları vardır.

Cubit

Cubit, “CUBe IT” (Cube it — Onu küplerle inşa et) kavramının kısaltmasıdır. Cubit, basit ve doğrusal durum yönetimi için kullanılır. Genellikle küçük ve orta ölçekli uygulamalarda tercih edilir. Cubit, Cubit sınıfından türetilir ve genellikle sadece bir tip durumu yönetir. Yalnızca durumun değiştiğinde yeniden yapılanmayı tetikler.

Bloc (Business Logic Component)

Bloc, “Business Logic Component” (İş Mantığı Bileşeni) kavramının kısaltmasıdır. Bloc, daha karmaşık durum yönetimi ve olay akışı gerektiren uygulamalar için daha uygundur. Genellikle büyük ve karmaşık uygulamalarda tercih edilir. Bloc, Bloc sınıfından türetilir ve olaylar (events) üzerinden durumları değiştirir.

Cubit ve Bloc Arasındaki Farklar

Cubit ve Bloc arasındaki ana farklar şunlardır:

  1. Karmaşıklık: Cubit, basit ve doğrusal durum yönetimi için kullanılırken, Bloc daha karmaşık durum yönetimi ve olay akışı gerektiren uygulamalar için daha uygundur.

  2. Olay Yönetimi: Cubit, genellikle tek bir olaya (event) yanıt olarak durumu güncellerken, Bloc, birden çok olayı (event) yönetir ve durumu günceller.

  3. Kullanım Alanı: Cubit, küçük ve orta ölçekli uygulamalarda kullanılmak üzere tasarlanmıştır. Bloc ise, büyük ve karmaşık uygulamalarda tercih edilir.

Bir Sayaç Uygulaması Oluşturma

Şimdi, Cubit ve Bloc yapılarını kullanarak basit bir sayaç uygulaması oluşturalım. Bu uygulama, kullanıcının artırma ve azaltma düğmelerine basarak sayacı değiştirmesine izin verecek.

Cubit ile Sayaç Uygulaması

Öncelikle, Cubit yapısını kullanarak sayaç uygulamasını oluşturalım.

import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

// Cubit sınıfını tanımla
class CounterCubit extends Cubit<int> {
  //değişkenin başlangıç değerinin ayarlandığı kısım
  CounterCubit() : super(0);
  //değer döndermek için return yerine emit yazıyoruz
  void increment() => emit(state + 1);
  void decrement() => emit(state - 1);
}
void main() {
  runApp(MyApp());
}
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      //Cubiti sayfa içerisine entegre ettiğimiz kısım
      home: BlocProvider( 
        create: (context) => CounterCubit(),
        child: CounterPage(),
      ),
    );
  }
}
class CounterPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final CounterCubit counterCubit = BlocProvider.of<CounterCubit>(context);
    return Scaffold(
      appBar: AppBar(
        title: Text('Cubit ile yapılan sayaç uygulaması'),
      ),
      //Cubit'in durumunu dinlediğimiz kısım.
      body: BlocBuilder<CounterCubit, int>(
        builder: (context, state) {
          return Center(
            child: Text(
              '$state',
              style: TextStyle(fontSize: 24.0),
            ),
          );
        },
      ),
      floatingActionButton: Column(
        mainAxisAlignment: MainAxisAlignment.end,
        crossAxisAlignment: CrossAxisAlignment.end,
        children: [
          FloatingActionButton(
            onPressed: () => counterCubit.increment(),
            child: Icon(Icons.add),
          ),
          SizedBox(height: 10),
          FloatingActionButton(
            onPressed: () => counterCubit.decrement(),
            child: Icon(Icons.remove),
          ),
        ],
      ),
    );
  }
}

Bu kod, Cubit yapısını kullanarak basit bir sayaç uygulaması oluşturur. Cubit sınıfını tanımlar ve artırma ve azaltma yöntemlerini içerir. BlocProvider widget'ını kullanarak Cubit'i sayfa içine entegre eder ve BlocBuilder widget'ını kullanarak Cubit'in durumunu dinler ve sayfa içeriğini günceller.

Bloc ile Sayaç Uygulaması

Şimdi, Bloc yapısını kullanarak sayaç uygulamasını oluşturalım.

import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
// Bloc sınıfını tanımla
class CounterBloc extends Bloc<CounterEvent, int> {
  //değişkenin başlangıç değerini ayarladığımız kısım
  CounterBloc() : super(0);
  @override
  Stream<int> mapEventToState(CounterEvent event) async* {
    switch (event) {
      case CounterEvent.increment:
        yield state + 1;
        break;
      case CounterEvent.decrement:
        yield state - 1;
        break;
    }
  }
}
// Etkinliklerin temsil edildiği enum
enum CounterEvent { increment, decrement }
void main() {
  runApp(MyApp());
}
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      //Bloc yapısını sayfa içerisine entegre ettiğimiz kısım
      home: BlocProvider(
        create: (context) => CounterBloc(),
        child: CounterPage(),
      ),
    );
  }
}
class CounterPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final CounterBloc counterBloc = BlocProvider.of<CounterBloc>(context);
    return Scaffold(
      appBar: AppBar(
        title: Text('Bloc ile yapılan sayaç uygulaması'),
      ),
      //Bloc'un durumunu dinlediğimiz kısım
      body: BlocBuilder<CounterBloc, int>(
        builder: (context, state) {
          return Center(
            child: Text(
              '$state',
              style: TextStyle(fontSize: 24.0),
            ),
          );
        },
      ),
      floatingActionButton: Column(
        mainAxisAlignment: MainAxisAlignment.end,
        crossAxisAlignment: CrossAxisAlignment.end,
        children: [
          FloatingActionButton(
            onPressed: () => counterBloc.add(CounterEvent.increment),
            child: Icon(Icons.add),
          ),
          SizedBox(height: 10),
          FloatingActionButton(
            onPressed: () => counterBloc.add(CounterEvent.decrement),
            child: Icon(Icons.remove),
          ),
        ],
      ),
    );
  }
}

Bu kod, Bloc yapısını kullanarak basit bir sayaç uygulaması oluşturur. Bloc sınıfını tanımlar ve olayları dinler. BlocProvider widget'ını kullanarak Bloc'u sayfa içine entegre eder ve BlocBuilder widget'ını kullanarak Bloc'un durumunu dinler ve sayfa içeriğini günceller.

Bu makalede, Flutter’da Cubit ve Bloc yapılarını inceledik. Cubit, basit ve doğrusal durum yönetimi için kullanılırken, Bloc daha karmaşık durum yönetimi ve olay akışı gerektiren uygulamalar için daha uygundur. Her iki yapı da kodunuzu daha modüler, test edilebilir ve ölçeklenebilir hale getirir. Ayrıca, her iki yapıyı kullanarak basit bir sayaç uygulaması oluşturmayı da gördük. Umarım bu makale, Flutter geliştirme sürecinizde size yardımcı olur.

İlginizi Çekebilecek İçerikler

gprc API

[

OTOMASYON

]

Hızlı İletişim: gRPC API

Mikroservis mimarilerinde servisler arası iletişimde yaygın olarak gRPC kullanılır. Hızlı bir şekilde çalışması nedeniyle servisler arasında data transferi, hesaplama işlemleri hızlıca client tarafına hazırlanır. Bu yazımızda gRPC üzerine yoğunlaşacağız. “API nedir?” yazımıda birden fazla API çeşiti olduğunda bunların farklı yerlerde efektif bir şekilde kullanılması gerektiğini söylemiştik. Şimdi adım adım gRPC’yi anlamaya çalışalım.

gprc API

[

OTOMASYON

]

Hızlı İletişim: gRPC API

Mikroservis mimarilerinde servisler arası iletişimde yaygın olarak gRPC kullanılır. Hızlı bir şekilde çalışması nedeniyle servisler arasında data transferi, hesaplama işlemleri hızlıca client tarafına hazırlanır. Bu yazımızda gRPC üzerine yoğunlaşacağız. “API nedir?” yazımıda birden fazla API çeşiti olduğunda bunların farklı yerlerde efektif bir şekilde kullanılması gerektiğini söylemiştik. Şimdi adım adım gRPC’yi anlamaya çalışalım.

gprc API

[

OTOMASYON

]

Hızlı İletişim: gRPC API

Mikroservis mimarilerinde servisler arası iletişimde yaygın olarak gRPC kullanılır. Hızlı bir şekilde çalışması nedeniyle servisler arasında data transferi, hesaplama işlemleri hızlıca client tarafına hazırlanır. Bu yazımızda gRPC üzerine yoğunlaşacağız. “API nedir?” yazımıda birden fazla API çeşiti olduğunda bunların farklı yerlerde efektif bir şekilde kullanılması gerektiğini söylemiştik. Şimdi adım adım gRPC’yi anlamaya çalışalım.

[

API

]

5 Business Tasks You Didn’t Know You Could Automate

From scheduling to data entry, here’s how Bima can help you reclaim hours every week.

[

API

]

5 Business Tasks You Didn’t Know You Could Automate

From scheduling to data entry, here’s how Bima can help you reclaim hours every week.

[

API

]

5 Business Tasks You Didn’t Know You Could Automate

From scheduling to data entry, here’s how Bima can help you reclaim hours every week.

[

TASARIM

]

Komponent Tabanlı Düşünmek: Tasarımda Lego Mantığı

“Komponent tabanlı düşünceyle tasarımda tutarlılığı, hızı ve ölçeklenebilirliği nasıl yakalarsınız? Lego mantığı üzerinden Figma kullanımı ve gerçek örneklerle anlatım.”

[

TASARIM

]

Komponent Tabanlı Düşünmek: Tasarımda Lego Mantığı

“Komponent tabanlı düşünceyle tasarımda tutarlılığı, hızı ve ölçeklenebilirliği nasıl yakalarsınız? Lego mantığı üzerinden Figma kullanımı ve gerçek örneklerle anlatım.”

[

TASARIM

]

Komponent Tabanlı Düşünmek: Tasarımda Lego Mantığı

“Komponent tabanlı düşünceyle tasarımda tutarlılığı, hızı ve ölçeklenebilirliği nasıl yakalarsınız? Lego mantığı üzerinden Figma kullanımı ve gerçek örneklerle anlatım.”