FutureBuilder во Flutter

Jan 21 2023
Привет, коллега-любитель флаттера! Сегодня мы узнаем больше о том, как правильно отображать асинхронные данные из Future<T> с помощью FutureBuilder во флаттере. Мы все знаем, что Future<T> — это круто.

Привет, коллега-любитель флаттера!

Сегодня мы узнаем больше о том, как правильно отображать асинхронные данные из Future<T>with FutureBuilderво флаттере.

Мы все знаем, Future<T>это здорово. Это позволило нам выполнять асинхронную работу, например, извлекать данные с сервера, не задумываясь об Threads этом Deadlocks.

Future<Model> _doCalculation() async {
    // do calculation / computation asynchronously.
    ....
    return Model;
}

FutureBuilder<Model>(
        future: _doCalculationFuture,
        builder: (BuildContext context, AsyncSnapshot<Model> snapshot) {
          if (snapshot.hasData) {
            return DataWidget(snapshot.requireData);
          } else if (snapshot.hasError) {
            return ErrorWidget();
          } else {
            return CircularProgressIndicator();
          }
          return const SizedBox();
        },
      );

Мы должны быть осторожны при предоставлении. Future<T>Так FutureBuilder.как FutureBuilderwill обычно находится внутри метода build, и мы знаем, buildчто метод может вызываться несколько раз, мы не должны создавать Future<T>внутри него.

Если мы создадим Future<T>внутренний buildметод, он будет создаваться снова при каждом buildвызове. Вероятно, это не то, что вы хотите.

Итак, где создатьfutures?

Идеальное место для создания или обновления будущего — это методы жизненного цикла виджета, такого как и initState, didUpdateWidget, didChangeDependenciesт. д., или любое другое место, кромеbuild.

class _MyStatefulWidgetState extends State<MyStatefulWidget> {
  late Future<Model> _doCalculationFuture;

  @override
  void initState() {
    super.initState();
    _doCalculationFuture = _doCalculation();
  }

  Future<Model> _doCalculation() async {
    return await Future<Model>.delayed(
      const Duration(seconds: 2),
      () => Model(),
    );
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder<Model>(
      future: _doCalculationFuture,
      builder: (BuildContext context, AsyncSnapshot<Model> snapshot) {
        if (snapshot.hasData) {
          return DataWidget(snapshot.requireData);
        } else if (snapshot.hasError) {
          return ErrorWidget();
        } else {
          return CircularProgressIndicator();
        }
        return const SizedBox();
      },
    );
  }
}

Удачного кодирования!!