Dart: ожидание вызова функции не ожидает и не возвращает объект Future - PullRequest
0 голосов
/ 23 апреля 2020

Я совершенно новичок в разработке Dart and Flutter, я понимаю, что Asyn c ... Жду Javascript, но не могу получить аналогичные результаты в Dart.

Ниже приведена упрощенная версия Приложение, управляемое базой данных:

import 'package:flutter/material.dart';

class MyTestActivity extends StatelessWidget {
  Future<int> testFunction() async {
    // Code returning Integer value from Await function Call
    return 20;
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Test',
        home: Scaffold(
          appBar: AppBar(
            title: Text('TEST'),
          ),
          body: Container(
            margin:
                const EdgeInsets.only(top: 10, bottom: 10, left: 5, right: 5),
            child: Text(testFunction().toString()),
          ),
        ));
  }
}

Ниже приведен результат вышеприведенного виджета: enter image description here

Я бы хотел получить значение 20 там.

Ответы [ 2 ]

2 голосов
/ 23 апреля 2020

A Будущее в дротике похоже на Обещание из javascript. Он вернет значение, когда оно будет разрешено (или выдаст ошибку при отклонении). И поскольку вы имеете дело с Promise (Future), здесь возвращаемое значение testFunction (если вы его не ждете) будет Promise ( Будущее). Я бы порекомендовал, если вы используете Futures в своем дереве Widget, посмотрите на FutureBuilder Widget, который позволит вам лучше обрабатывать Futures в дереве Widget. Пока что реструктурируйте ваше приложение.

@override
Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Test',
        home: Scaffold(
          appBar: AppBar(
            title: Text('TEST'),
          ),
          body: Container(
            margin:
                const EdgeInsets.only(top: 10, bottom: 10, left: 5, right: 5),
            child: FutureBuilder (
                 future: testFunction,
                 builder: (BuildContext context, AsyncSnapshot snapshot, ) {
                    if (snapshot.hasData) {
                         return Text (snapshot.data.toString());
                     }
                     return CircularProgressIndicator();
                  }
              ),
          ),
        ));
  }
1 голос
/ 23 апреля 2020

Ответ, данный Саудом, работал для меня, но у кода в его Ответе есть некоторые проблемы, я добавляю код, который работал для меня:

@override
Widget build(BuildContext context) {
  return MaterialApp(
    title: 'Test',
    home: Scaffold(
      appBar: AppBar(
        title: Text('TEST'),
      ),
      body: Container(
        margin:
            const EdgeInsets.only(top: 10, bottom: 10, left: 5, right: 5),
        child: FutureBuilder<int>(
            future: testFunction(),// Even on Flutter website it's without parentheses but did not work.
            builder: (BuildContext context, AsyncSnapshot<int> snapshot) {
              if (snapshot.hasData) {
                return Text(snapshot.data.toString());
              }
              return CircularProgressIndicator();
            }),
      ),
    ));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...