Future yeniden çalıştırma
- Flutter kursu
- Orta seviye
- Ders 24/99
- 4 dk
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
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
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
void yenidenDene() {
setState(() {
_future = ____();
});
}
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ı |