FutureBuilder Flutter не возвращает данных из моих расчетов - PullRequest
0 голосов
/ 07 мая 2020

Я не могу заставить FutureBuilder отображать какие-либо данные из моих вычислений. Я знаю, что расчет определенно верен, потому что я могу получить правильный ответ, который будет напечатан в консоли, но просто не могу отобразить его в самом приложении.

Вот код для кода:

 Future<String> getBeerDrinksTarget() async {
    final user = await _auth.currentUser();
    loggedInUser = user;
    double beerNumber;
    var query = _firestore
        .collection('goals')
        .where('email', isEqualTo: '${loggedInUser.email}');

    query.getDocuments(source: Source.cache).then((data) {
      beerPercentage = data.documents[0].data['beerPercentage'];

      var y = double.parse(beerPercentage);

      double beerNumber = (y / 100) * 21;

      print('${beerNumber.toStringAsFixed(1)} target number of weekly beers');

      print('$beerPercentage% weekly beer target as a percentage of total weekly drinks');
    });

    return beerNumber.toStringAsFixed(1);
  }

А вот код для виджета FutureBuilder:

FutureBuilder<String>(
                        future: getBeerDrinksTarget(),
                        builder: (BuildContext context,
                            AsyncSnapshot<String> snapshot) {
                          if (snapshot.hasData) {
                            return Center(
                              child: Text(
                                '${snapshot.data}',
                              ),
                            );
                          } else
                            return Text('no data yet');
                        }),

Странная часть этого состоит в том, что если я поменяю return beerNumber.toStringAsFixed(1); на return beerPercentage;, он отображает beerPercentage нормально в приложении. Это говорит о том, что код FutureBuilder в порядке. Но почему не работает, когда я использую return beerNumber.toStringAsFixed(1);? Это та часть, которую мне нужно отображать в приложении. Это странно, потому что расчет отлично выводится в консоль, поэтому можно предположить, что я, должно быть, сделал ошибку в коде FutureBuilder(), а не в коде getBeerDrinksTarget().

Кто-нибудь может заметить, где я? что-то пошло не так?

Заранее благодарим за помощь!

Джейсон

1 Ответ

1 голос
/ 07 мая 2020
final response = await query.getDocuments(source: Source.cache);
      beerPercentage = response.documents[0].data['beerPercentage'];

      var y = double.parse(beerPercentage);

      double beerNumber = (y / 100) * 21;

      print('${beerNumber.toStringAsFixed(1)} target number of weekly beers');

      print('$beerPercentage% weekly beer target as a percentage of total weekly drinks');


    return beerNumber.toStringAsFixed(1);

Это сработает. Попробуйте и дайте нам знать, чтобы я мог добавить объяснение. функция, а. затем продолжает выполнение остальной части функции после добавления обратного вызова в цепочку обратного вызова. Как указывает @pskink, поскольку вы возвращаете значение вне метода .then, оно возвращается до того, как .then полностью выполнится. Вот почему ваш beerPercentage был успешно возвращен, но ДО того, как было достигнуто выполнение кода для вычисления beerNumber, уже было возвращено нулевое значение. Было бы хорошо, если бы оператор return также был внутри обратного вызова then. В противном случае await - гораздо более простой подход. С другой стороны, await останавливает все остальное и ждет, пока будущее разрешится первым, а затем продолжит выполнение остальной части кода.

Ваши операторы печати также выполнялись после возврата значения, поэтому вы могли видеть и beerNumber, и beerPercentage в печати. ​​

Надеюсь, это проясняет воздух!

Спасибо за редактирование @ pskink

...