CodeBlanks Logo Icon CodeBlanks

BlocBuilder

BlocBuilder ile state'i dinleyip arayüzü yeniden çizmeyi öğrenirsin.

BlocBuilder

BlocBuilder, bir Cubit veya Bloc'u dinler ve state değiştiğinde alt widget'ı yeniden çizer. builder fonksiyonu mevcut state'i alır ve widget döndürür.

BlocBuilder<SayacCubit, int>(
  builder: (context, state) {
    return Text('$state');
  },
)

BlocBuilder, her state değişikliğinde yeniden çağrılır.

builder fonksiyonu

builder, BuildContext ve güncel state parametrelerini alır. State'e göre farklı widget'lar döndürebilirsin.

BlocBuilder<SayacCubit, int>(
  builder: (context, sayac) {
    return Text('Sayaç: $sayac');
  },
)

builder saf (pure) olmalıdır; yan etkisi olmamalıdır.

Uygulama BlocBuilder ile state'i göster

Ekrani'de BlocBuilder<SayacCubit, int> kullanarak state'i Text('$state') olarak göster. Butona basıldığında context.read<SayacCubit>().artir() çağır. main içinde print('ekran hazır') çağır.

Başlangıç kodu

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

class SayacCubit extends Cubit<int> {
  SayacCubit() : super(0);
  void artir() => emit(state + 1);
}

void main() {
  print('ekran hazır');
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return BlocProvider<SayacCubit>(
      create: (_) => SayacCubit(),
      child: MaterialApp(home: Ekrani()),
    );
  }
}

class Ekrani extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // BlocBuilder ile state'i göster
    return Scaffold(
      body: Center(child: Text('?')),
      floatingActionButton: FloatingActionButton(
        onPressed: () {},
        child: Icon(Icons.add),
      ),
    );
  }
}

Örnek çözüm

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

class SayacCubit extends Cubit<int> {
  SayacCubit() : super(0);
  void artir() => emit(state + 1);
}

void main() {
  print('ekran hazır');
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return BlocProvider<SayacCubit>(
      create: (_) => SayacCubit(),
      child: MaterialApp(home: Ekrani()),
    );
  }
}

class Ekrani extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: BlocBuilder<SayacCubit, int>(
          builder: (context, state) => Text('$state'),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () => context.read<SayacCubit>().artir(),
        child: Icon(Icons.add),
      ),
    );
  }
}

Beklenen çıktı

ekran hazır

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 BlocBuilder ne zaman yeniden inşa edilir?

  • Hot reload sırasında
  • Cubit yeni state yayınladığında Doğru cevap
  • Yalnızca hata durumunda
  • Yalnızca initState'te

Açıklama: BlocBuilder, Cubit emit ile yeni state yayınladığında builder fonksiyonunu yeniden çağırır.

2 BlocBuilder'ın builder'ını tamamla

Soru
BlocBuilder<SayacCubit, int>(
  ____: (context, state) => Text('$state'),
)
Cevap
BlocBuilder<SayacCubit, int>(
  builder: (context, state) => Text('$state'),
)

Açıklama: BlocBuilder'ın builder parametresi, BuildContext ve state alıp widget döndüren fonksiyonu alır.

3 BlocBuilder parçaları

Kavram Anlamı
BlocBuilder Cubit'i dinleyip yeniden çizen widget
builder State'ten widget üreten fonksiyon
context BuildContext parametresi
state Güncel state değeri

Orta seviye bölümündeki tüm dersler