Неудачное утверждение: логическое выражение не должно быть нулевым исключением - PullRequest
1 голос
/ 14 января 2020

Я делаю часть CheckUpdate, которая проверяет последнюю версию в Интернете (json) и пытаюсь сравнить. Он разбирает JSON и преобразует в строку. А потом попробуй сравнить с appBuildNumber. Но это дает мне ошибку Failed Assertion: Boolean expression must not be null. Есть идеи по этому вопросу? PS Сервер проверки версии: https://raw.githubusercontent.com/TanzenT/LiteCalculator/master/version.json Код

class CalculatorPageHolder extends StatefulWidget {
  CalculatorPageHolder({Key key, this.title}) : super(key: key);
  final String title;

  @override
  _CalculatorPageHolderState createState() => _CalculatorPageHolderState();
}

class _CalculatorPageHolderState extends State<CalculatorPageHolder> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      drawer: Drawer(child: mainDrawer()),
      body: Center(
          child: FutureBuilder<List<Version>>(
        future: fetchVersion(),
        builder: (context, snapshot) {
          if (snapshot.hasError) print(snapshot.error);

          return snapshot.hasData
              ? CalculatorHolder(version: snapshot.data)
              : Center(child: CircularProgressIndicator());
        },
      )),
    );
  }
}

class CalculatorHolder extends StatelessWidget {
  final List<Version> version;

  CalculatorHolder({Key key, this.version}) : super(key: key);

  Widget checkIsLatest() {
    print(version[0].version);
    if (getPackageInfo(version[0].version)) {
      return Column(
        mainAxisAlignment: MainAxisAlignment.end,
        children: <Widget>[Text('latest')],
      );
    } else {
      return Column(
        mainAxisAlignment: MainAxisAlignment.end,
        children: <Widget>[Text('not latest')],
      );
    }
  }

  @override
  Widget build(BuildContext context) {
    return Container(child: checkIsLatest());
  }
}

getPackageInfo(String _currnetVersion) {
  PackageInfo.fromPlatform().then((PackageInfo packageInfo) {
    String _buildNumber = packageInfo.buildNumber;
    print('Client Version : $_buildNumber');
    print('Server Version : $_currnetVersion');
    if (_buildNumber == _currnetVersion)
      return true;
    else
      return false;
  });
}

Ответы [ 2 ]

2 голосов
/ 14 января 2020

Вы на самом деле не возвращаете значение из getPackageInfo. (Операторы возврата находятся в функции, которую вы передаете then.) Таким образом, getPackageInfo возвращает null, а ваш оператор if, в котором вы проверяете, терпит неудачу.

Make getPackageInfo async, удалить then и использовать await PackageInfo.fromPlatform() - теперь он может вернуть Future<bool>. Конечно, теперь вам нужно дождаться результата, чего вы не можете сделать в build.

Рассмотрите возможность перемещения кода для переноса текущего пакета в виджет с состоянием (вызовите его из initState) и просто передать bool в зависимости от того, является ли текущий или нет вниз CalculatorHolder вместо строки версии.

2 голосов
/ 14 января 2020

getPackageInfo фактически ничего не возвращает, поэтому по умолчанию возвращается null, который не является допустимым логическим значением.

Вам нужно будет сделать что-то вроде этого:

Future<bool> getPackageInfo(String _currentVersion) async {
  final packageInfo = await PackageInfo.fromPlatform();
  String _buildNumber = packageInfo.buildNumber;
  print('Client Version : $_buildNumber');
  print('Server Version : $_currentVersion');
  return _buildNumber == _currentVersion;
}

Обратите внимание, этот метод возвращает Future сейчас, и его нужно будет ждать, прежде чем вы сможете использовать полученное логическое значение. Вы, вероятно, захотите поднять это из своего виджета и сделать это один раз, так как он, вероятно, не должен меняться во время выполнения, поскольку он получает информацию о пакете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...