Дождитесь завершения всех асинхронных функций перед выполнением в Flutter

#flutter

#flutter

Вопрос:

Я использую Flutter для своего приложения. Мне нужно запросить большое количество информации из базы данных Firebase в реальном времени (например, 50 различных местоположений данных), поэтому мне нужно запускать их асинхронно и ждать, пока все они вернутся, прежде чем обновлять пользовательский интерфейс, чтобы показать пользователю информацию.

Как я могу добиться этого в Flutter? Используя async, await, я мог дождаться только 1 асинхронной функции.

Ответ №1:

Пожалуйста, ознакомьтесь с методом Future.wait. С помощью Future.wait() вы можете запускать несколько запросов, а затем ждать их завершения. Я также привел пример кода ниже.

метод ожидания

 Future<List<T>> wait <T>(

    Iterable<Future<T>> futures,
    {bool eagerError: false,
    void cleanUp(
        T successValue
    )}

)
 

Ожидает завершения нескольких фьючерсов и собирает их результаты.

Возвращает future, который завершится после завершения всех предоставленных фьючерсов либо с их результатами, либо с ошибкой, если какой-либо из предоставленных фьючерсов завершится неудачей.

Значение возвращаемого future будет представлять собой список всех значений, которые были созданы в том порядке, в котором фьючерсы предоставляются итерацией фьючерсов.

Если какое-либо будущее завершается с ошибкой, то возвращенное будущее завершается с этой ошибкой. Если дальнейшие фьючерсы также завершаются с ошибками, эти ошибки отбрасываются.

Если значение eagerError равно true, возвращаемое будущее завершается с ошибкой сразу после первой ошибки из одного из фьючерсов. В противном случае все фьючерсы должны завершиться до завершения возвращаемого future (по-прежнему с первой ошибкой; остальные ошибки автоматически удаляются).

В случае ошибки очистка (если она предусмотрена) вызывается для любого ненулевого результата успешных фьючерсов. Это позволяет очищать ресурсы, которые в противном случае были бы потеряны (поскольку возвращаемый future не предоставляет доступ к этим значениям). Функция очистки не используется, если ошибки нет.

Вызов cleanUp не должен вызывать. Если это произойдет, ошибка будет неперехваченной асинхронной ошибкой.

Пожалуйста, смотрите Пример кода ниже, результат всех трех фьючерсов загружается в ListView одновременно, начиная с Future.wait ожидает завершения всех фьючерсов, прежде чем возвращать результат :

 import 'package:flutter/material.dart';

void main(List<String> args) {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  Future<List<String>> futureWait() async {
    return Future.wait([
      Future.delayed(const Duration(seconds: 1), () => "First Future Done"),
      Future.delayed(const Duration(seconds: 2), () => "Second Future Done"),
      Future.delayed(const Duration(seconds: 3), () => "Third Future Done"),
    ]);
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text("Flutter Demo App"),
        ),
        body: FutureBuilder<List<String>>(
          future: futureWait(),
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              print(snapshot.data.length);
              return ListView.builder(
                itemCount: snapshot.data.length,
                itemBuilder: (context, index) => ListTile(
                  title: Text(snapshot.data[index]),
                ),
              );
            }
            return const Center(child: CircularProgressIndicator());
          },
        ),
      ),
    );
  }
}