Sobes.tech
Junior

Какво е FutureBuilder във Flutter?

sobes.tech AI

Отговор от AI

Уиджет за създаване на интерфейс въз основа на асинхронни данни, получени от Future.

Основни параметри:

  • future: Екземпляр на Future, който трябва да се наблюдава.
  • initialData: Данни, които се показват преди завършването на future.
  • builder: Функция (AsyncWidgetBuilder), която се извиква при всяка промяна на състоянието на future и получава BuildContext и AsyncSnapshot.

Състояния на AsyncSnapshot:

  • ConnectionState.none: Future все още не е започнал.
  • ConnectionState.waiting: Future се изпълнява.
  • ConnectionState.active: (Редко за Future) Future е върнал междинни данни.
  • ConnectionState.done: Future е завършил (успешно или с грешка).

Пример за използване:

// Предполагаме, че имаме функция, която връща Future<String>
Future<String> fetchData() async {
  await Future.delayed(Duration(seconds: 2)); // Имитация на мрежов заявка
  return "Данните са заредени!";
}

// ... в build метода на widget:
@override
Widget build(BuildContext context) {
  return FutureBuilder<String>(
    future: fetchData(), // Нашият Future
    builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
      if (snapshot.connectionState == ConnectionState.waiting) {
        // Показваме индикатор за зареждане, докато Future се изпълнява
        return CircularProgressIndicator();
      } else if (snapshot.hasError) {
        // Показваме съобщение за грешка, ако Future завърши с грешка
        return Text('Грешка: ${snapshot.error}');
      } else {
        // Показваме данните, ако Future е успешно завършил
        return Text('Резултат: ${snapshot.data}');
      }
    },
  );
}

Предимства:

  • Улеснява работата с асинхронни операции в UI.
  • Автоматично прерисува UI при промяна на състоянието на Future.
  • Ясно разделя логиката за зареждане на данни и логиката за създаване на UI.

Недостатъци:

  • Може да доведе до ненужни повторни прерисувания, ако Future се създава вътре в метода build. Препоръчително е да се създава Future веднъж (например, в initState).