асинхронный вызов flutter не выполняется асинхронно в initState () - PullRequest
1 голос
/ 10 ноября 2019

Я вызываю асинхронную функцию в initState (), но система фактически ожидает результата асинхронной функции. Может кто-нибудь сказать мне, почему?

Вот мой код:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(home: MyHomePage());
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  Future<int> _f;

  @override
  void initState() {
    super.initState();
    Stopwatch stopwatch = new Stopwatch()..start();
    print('executed in ${stopwatch.elapsed}');
    _f = getFuture();
    print('executed in ${stopwatch.elapsed}');
  }

  Future<int> getFuture() async {
    int i = 0;
    while(i < 1000000000) {
      i++;
    }
    return i;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("test")),
      body: FutureBuilder<int>(
        future: _f,
        builder: (context, snapshot) {
          switch (snapshot.connectionState) {
            case ConnectionState.done:
              return Center(child: Text("snapshot: ${snapshot.data}"));
              break;
            default:
              return Center(child: CircularProgressIndicator());
          }
        }

      ),
    );
  }
}

А вот вывод:

I/flutter (22058): executed in 0:00:00.000384
I/flutter (22058): executed in 0:00:04.536278

1 Ответ

1 голос
/ 10 ноября 2019

Функция Future предназначена для асинхронного возврата объекта Future. Это означает выполнение оператора кода один раз, что займет гораздо больше времени, например получение объекта json из API, чем обычное время, требуемое для нормального оператора, например объявление переменной.

Однако, вы выполняете нормальный оператор, который требует выполнения миллисекунд, 1000000000 раз. Это приведет к большему времени выполнения , которое формируется за миллисекунды каждого выполнения.

Даже если это функция Future, она не возвращает объект Futureили переменная, поэтому она не является асинхронной.

...