Как вернуть строку с асинхронным - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь вернуть строковое значение из асинхронного c метода.

Вот мой класс утилит:

class Utilities {

  Future<PackageInfo> getPackageInfo() async {
    PackageInfo packageInfo = await PackageInfo.fromPlatform();
    return packageInfo;
  }

  String getVersion() {
    String version;
    getPackageInfo().then((PackageInfo pi) {
      version = pi.version;
    });
    return version;
  }

}

Вот мой интерфейс, где я вызываю метод getVersion :

class abc extends StatelessWidget {

  Utilities _utilities = new Utilities();

  @override
  Widget build(BuildContext context) {
  ...
  Text(_utilities.getVersion()),
  ...

}

Я всегда получаю ошибку нулевого значения в виджете Text ().

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Ваш код в методе getVersion выполняется асинхронно. Означает, что функция возвратит путь до того, как ваше предложение then будет вызвано / выполнено, таким образом, оно возвращает нулевое значение и приводит к ошибке нулевого значения.

Если ваш пользовательский интерфейс зависит от использования в будущем FutureBuilder . Замените текстовый виджет следующим кодом:

FutureBuilder<String>(
    future: getVersion(),
    builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
      if (snapshot.hasData) {
        return Text(snapshot.data);
      } else if (snapshot.hasError) {
        return Text('Oh no!!!');
      } else {
        return CircularProgressIndicator()
      },
   },
),

и измените метод getVersion следующим образом:

Future<String> getVersion() async {
  PackageInfo pi = await getPackageInfo();
  return pi.version;
}
1 голос
/ 22 апреля 2020

Вы возвращаете обычный String, в то время как вы должны обернуть его в Future:

Future<String> getVersion() async => getPackageInfo().then((PackageInfo pi) => pi.version);

, и виджет Text станет:

FutureBuilder<String>(
                    future: getVersion(),
                    builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
                     if(snapshot.connectionState==ConnectionState.waiting)
                       return CircularProgressIndicator();
                     else if(snapshot.connectionState==ConnectionState.done && snapshot.hasData)
                       return Text(snapshot.data);
                     //handle other connection statuses
                    }
                ),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...