Ana içeriğe atla

FutureProvider

FutureProvider, asenkron kodlar için Provider'ın eşdeğeridir.

FutureProvider genellikle şu amaçlarla kullanılır:

  • asenkron işlemleri (ağ istekleri gibi) gerçekleştirmek ve önbelleğe almak
  • asenkron işlemlerin hata/yükleme durumlarını iyi bir şekilde yönetmek
  • birden fazla asenkron değeri başka bir değerde birleştirmek

FutureProvider, ref.watch ile birleştirildiğinde çok iyi çalışır. Bu kombinasyon, bazı değişkenler değiştiğinde otomatik olarak bazı verilerin alınmasını sağlar ve her zaman en güncel değere sahip olmamızı garanti eder.

bilgi

FutureProvider, kullanıcı etkileşiminden sonra hesaplamayı doğrudan değiştirmek için bir yol sunmaz. Basit kullanım durumlarını çözmek için tasarlanmıştır.
Daha gelişmiş senaryolar için StateNotifierProvider kullanmayı düşünün.

Kullanım Örneği: Bir yapılandırma dosyasını okumak

FutureProvider, bir JSON dosyasını okuyarak oluşturulan bir Configuration nesnesini göstermenin uygun bir yolu olabilir.

Yapılandırmanın oluşturulması, tipik async/await sözdizimiyle yapılır, ancak provider içinde. Flutter'ın varlık sistemi kullanılarak, bu şöyle olurdu:



Future<Configuration> fetchConfiguration(FetchConfigurationRef ref) async {
final content = json.decode(
await rootBundle.loadString('assets/configurations.json'),
) as Map<String, Object?>;

return Configuration.fromJson(content);
}

Daha sonra, kullanıcı arayüzü yapılandırmaları şu şekilde dinleyebilir:


Widget build(BuildContext context, WidgetRef ref) {
final config = ref.watch(fetchConfigurationProvider);

return switch (config) {
AsyncError(:final error) => Text('Error: $error'),
AsyncData(:final value) => Text(value.host),
_ => const CircularProgressIndicator(),
};
}

Bu, Future tamamlandığında kullanıcı arayüzünü otomatik olarak yeniden oluşturur. Aynı zamanda, birden fazla widget yapılandırmaları isterse, varlık yalnızca bir kez çözümlenir.

Gördüğünüz gibi, bir widget içinde bir FutureProvider dinlemek bir AsyncValue döndürür, bu da hata/yükleme durumlarını yönetmeyi sağlar.