CodeBlanks Logo Icon CodeBlanks

Future yeniden çalıştırma

Future'ı yeniden çalıştırmak için key ve setState kullanmayı öğrenirsin.

Future yeniden çalıştırma

Bir FutureBuilder'ı yeniden çalıştırmak için yeni bir Future örneği vermek gerekir. setState içinde _future değişkenini yeniden atayarak FutureBuilder yeniden inşa edilir ve Future yeniden çalışır.

void yenidenDene() {
  setState(() {
    _future = veriGetir();
  });
}

Yeni Future ataması, FutureBuilder'ı yeniden tetikler.

key ve setState

FutureBuilder'ı yeniden oluşturmak için key kullanmak da bir yoldur. ValueKey her denemede değiştiğinde widget yeniden inşa edilir. Ancak en yaygın yöntem, setState ile yeni Future atamaktır.

FutureBuilder(
  key: ValueKey(_denemeSayisi),
  future: _future,
  builder: ...,
)

key değişince widget tamamen yeniden oluşturulur.

Uygulama Yeniden dene butonuyla Future'ı tetikle

veriGetir async metodu 100 ms bekleyip 'Yeniden yüklendi' döndürsün. Ekrani stateful widget'ında _future field'ı tut, initState'te print('ekran açıldı') çağır ve _future'a veriGetir() ata. Butona basıldığında setState ile _future'ı yeniden ata. FutureBuilder<String> ile snapshot.data ?? 'bekle' göster.

Başlangıç kodu

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

Future<String> veriGetir() async {
  await Future.delayed(Duration(milliseconds: 100));
  return 'Yeniden yüklendi';
}

class Ekrani extends StatefulWidget {
  @override
  _EkraniState createState() => _EkraniState();
}

class _EkraniState extends State<Ekrani> {
  // _future field ekle
  // initState: print çağır ve future'ı başlat
  // yenidenDene: setState ile future'ı yeniden ata

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(child: Text('bekle')),
      floatingActionButton: FloatingActionButton(
        onPressed: yenidenDene,
        child: Icon(Icons.refresh),
      ),
    );
  }
}

void main() => runApp(MaterialApp(home: Ekrani()));

Örnek çözüm

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

Future<String> veriGetir() async {
  await Future.delayed(Duration(milliseconds: 100));
  return 'Yeniden yüklendi';
}

class Ekrani extends StatefulWidget {
  @override
  _EkraniState createState() => _EkraniState();
}

class _EkraniState extends State<Ekrani> {
  late Future<String> _future;

  @override
  void initState() {
    super.initState();
    print('ekran açıldı');
    _future = veriGetir();
  }

  void yenidenDene() {
    setState(() {
      _future = veriGetir();
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: FutureBuilder<String>(
          future: _future,
          builder: (context, snapshot) {
            return Text(snapshot.data ?? 'bekle');
          },
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: yenidenDene,
        child: Icon(Icons.refresh),
      ),
    );
  }
}

void main() => runApp(MaterialApp(home: Ekrani()));

Beklenen çıktı

ekran açıldı

Soru ve cevaplar

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

1 FutureBuilder'ı yeniden çalıştırmanın doğru yolu nedir?

  • Aynı Future referansını tekrar vermek
  • setState içinde yeni bir Future atamak Doğru cevap
  • Hot reload yapmak
  • Uygulamayı kapatıp açmak

Açıklama: setState içinde _future'a yeni bir Future örneği atamak FutureBuilder'ı yeniden tetikler ve Future yeniden çalışır.

2 setState ile Future'ı yeniden ata

Soru
void yenidenDene() {
  setState(() {
    _future = ____();
  });
}
Cevap
void yenidenDene() {
  setState(() {
    _future = veriGetir();
  });
}

Açıklama: setState içinde _future'a yeni bir veriGetir() çağrısı atanır; bu FutureBuilder'ı yeniden tetikler.

3 Future yeniden çalıştırma parçaları

Kavram Anlamı
setState Yeniden atama yapıldığı blok
yeni Future FutureBuilder'ı tetikleyen atama
ValueKey Widget'ı yeniden oluşturmak için anahtar
_future değişkeni Yeniden atanan state alanı

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