CodeBlanks Logo Icon CodeBlanks

State ve performans

setState'in maliyetini ve neyi rebuild edeceğini öğrenirsin.

setState'in maliyeti

Her setState çağrısı, ilgili widget'ın alt ağacını (subtree) yeniden inşa eder. Yani build metodu yeniden çalışır ve widget ağacı yeniden oluşturulur.

setState(() { _sayac++; });
// yalnızca bu widget'ın alt ağacı
// rebuild edilir

Ebeveyn widget'lar etkilenmez.

Rebuild kapsamı

setState yalnızca o State'e ait widget'ı yeniden inşa eder; ebeveyn widget'ların build metodu çağrılmaz. Bu yüzden büyük widget ağaçlarında state'i mümkün olduğunca aşağıya tutmak performansı artırır.

class Buyuk extends StatelessWidget {
  Widget build(BuildContext context) {
    // Buyuk rebuild olmaz
    return Kucuk();
  }
}

State'i küçük bir subtree'te tutarsan rebuild maliyeti düşer.

Uygulama Ebeveyn stateless, çocuk stateful sayaç

Ebeveyn stateless bir widget olsun. Sayac stateful widget'ı _sayac tutsun ve initState'te print('Sayac oluşturuldu') çağırsın. Butona basıldığında setState ile _sayac'ı artır.

Başlangıç kodu

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(home: Ebeveyn());
  }
}

class Ebeveyn extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(child: Sayac()),
    );
  }
}

class Sayac extends StatefulWidget {
  @override
  _SayacState createState() => _SayacState();
}

class _SayacState extends State<Sayac> {
  int _sayac = 0;

  @override
  void initState() {
    super.initState();
    print('Sayac oluşturuldu');
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Text('$_sayac'),
        ElevatedButton(
          // setState ile _sayac'ı artır
          onPressed: () {},
          child: Text('Artır'),
        ),
      ],
    );
  }
}

Örnek çözüm

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(home: Ebeveyn());
  }
}

class Ebeveyn extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(child: Sayac()),
    );
  }
}

class Sayac extends StatefulWidget {
  @override
  _SayacState createState() => _SayacState();
}

class _SayacState extends State<Sayac> {
  int _sayac = 0;

  @override
  void initState() {
    super.initState();
    print('Sayac oluşturuldu');
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Text('$_sayac'),
        ElevatedButton(
          onPressed: () {
            setState(() {
              _sayac++;
            });
          },
          child: Text('Artır'),
        ),
      ],
    );
  }
}

Beklenen çıktı

Sayac oluşturuldu

Soru ve cevaplar

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

1 setState çağrıldığında hangisi yeniden inşa edilir?

  • setState tüm uygulamayı yeniden inşa eder
  • setState ebeveyn widget'ı yeniden inşa eder ama çocukları etkilemez
  • setState yalnızca o State'in alt ağacını yeniden inşa eder Doğru cevap
  • setState hiçbir şeyi yeniden inşa etmez

Açıklama: setState yalnızca o State'e ait widget'ı ve alt ağacını yeniden inşa eder; ebeveynlerin build metodu çağrılmaz.

2 setState'ten sonra hangi metod çalışır

Soru
class _MyState extends State<MyWidget> {
  int x = 0;
  @override
  Widget ____(BuildContext context) {
    return Text('$x');
  }
}
Cevap
class _MyState extends State<MyWidget> {
  int x = 0;
  @override
  Widget build(BuildContext context) {
    return Text('$x');
  }
}

Açıklama: setState, State'i dirty işaretler ve sonraki frame'de build metodu yeniden çağrılır; ebeveynin build'i çağrılmaz.

3 Rebuild ve performans parçaları

Kavram Anlamı
setState Yalnızca o State'in alt ağacını yeniden inşa eder
Subtree Bir widget'ın kendisi ve tüm çocukları
Büyük ağaçta state aşağıda Rebuild maliyetini düşürür
Ebeveyn widget setState'ten etkilenmez

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