Исследование нескольких вариантов будущего с помощью FutureBuilder во Flutter

В Flutter виджет FutureBuilder — это мощный инструмент для обработки асинхронных операций и обновления пользовательского интерфейса в зависимости от состояния будущего. Он позволяет отображать различные компоненты пользовательского интерфейса в зависимости от будущего состояния, например показывать индикатор загрузки во время загрузки будущего или отображать сообщение об ошибке в случае сбоя будущего. В этой статье мы рассмотрим различные методы использования FutureBuilder для обработки нескольких фьючерсов в приложении Flutter.

Метод 1: использование нескольких FutureBuilder
Вы можете использовать несколько экземпляров виджета FutureBuilder для обработки нескольких фьючерсов в приложении Flutter. Каждый FutureBuilder можно связать с различным будущим и соответствующим образом обновить пользовательский интерфейс. Вот пример:

Future<int> fetchNumber() async {
  await Future.delayed(Duration(seconds: 2));
  return 42;
}
Future<String> fetchMessage() async {
  await Future.delayed(Duration(seconds: 2));
  return "Hello, FutureBuilder!";
}
class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        FutureBuilder<int>(
          future: fetchNumber(),
          builder: (context, snapshot) {
            if (snapshot.connectionState == ConnectionState.waiting) {
              return CircularProgressIndicator();
            } else if (snapshot.hasError) {
              return Text('Error: ${snapshot.error}');
            } else {
              return Text('Number: ${snapshot.data}');
            }
          },
        ),
        FutureBuilder<String>(
          future: fetchMessage(),
          builder: (context, snapshot) {
            if (snapshot.connectionState == ConnectionState.waiting) {
              return CircularProgressIndicator();
            } else if (snapshot.hasError) {
              return Text('Error: ${snapshot.error}');
            } else {
              return Text('Message: ${snapshot.data}');
            }
          },
        ),
      ],
    );
  }
}

Метод 2: объединение фьючерсов с Future.wait()
Если у вас есть несколько фьючерсов, которые необходимо разрешить одновременно, вы можете использовать метод Future.wait(), чтобы дождаться завершения всех фьючерсов.. Вот пример:

Future<int> fetchNumber() async {
  await Future.delayed(Duration(seconds: 2));
  return 42;
}
Future<String> fetchMessage() async {
  await Future.delayed(Duration(seconds: 2));
  return "Hello, FutureBuilder!";
}
class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return FutureBuilder<List<dynamic>>(
      future: Future.wait([fetchNumber(), fetchMessage()]),
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.waiting) {
          return CircularProgressIndicator();
        } else if (snapshot.hasError) {
          return Text('Error: ${snapshot.error}');
        } else {
          int number = snapshot.data[0];
          String message = snapshot.data[1];
          return Column(
            children: [
              Text('Number: $number'),
              Text('Message: $message'),
            ],
          );
        }
      },
    );
  }
}

Метод 3: объединение фьючерсов в цепочку с помощью.then()
Вы также можете объединить несколько фьючерсов в цепочку, используя метод .then(). Это позволяет выполнять последовательные операции, в которых результат одного будущего используется в качестве входных данных для следующего будущего. Вот пример:

Future<int> fetchNumber() async {
  await Future.delayed(Duration(seconds: 2));
  return 42;
}
Future<String> fetchMessage(int number) async {
  await Future.delayed(Duration(seconds: 2));
  return "The number is $number";
}
class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return FutureBuilder<int>(
      future: fetchNumber(),
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.waiting) {
          return CircularProgressIndicator();
        } else if (snapshot.hasError) {
          return Text('Error: ${snapshot.error}');
        } else {
          int number = snapshot.data;
          return FutureBuilder<String>(
            future: fetchMessage(number),
            builder: (context, snapshot) {
              if (snapshot.connectionState == ConnectionState.waiting) {
                return CircularProgressIndicator();
              } else if (snapshot.hasError) {
                return Text('Error: ${snapshot.error}');
              } else {
                String message = snapshot.data;
                return Text('Message: $message');
              }
            },
          );
        }
      },
    );
  }
}

В этой статье мы рассмотрели несколько методов обработки нескольких фьючерсов с помощью FutureBuilder во Flutter. Используя несколько FutureBuilder, комбинируя фьючерсы с помощью Future.wait() или объединяя фьючерсы в цепочку с помощью.then(), вы можете эффективно управлять асинхронными операциями и обновлять пользовательский интерфейс на основе состояния каждого фьючерса. Эти методы обеспечивают гибкость и контроль при обработке нескольких асинхронных задач в ваших приложениях Flutter.