【问题标题】:Failed assertion: boolean expression must not be null exception断言失败:布尔表达式不能为空异常
【发布时间】:2020-01-14 02:02:40
【问题描述】:

我正在制作一个 CheckUpdate 部件,用于检查 web(json) 上的最新版本并尝试进行比较。 它解析 JSON 并转换为字符串。 然后它尝试与 appBuildNumber 进行比较。 但它给了我错误Failed Assertion: Boolean expression must not be null。 关于这个问题的任何想法? 附言版本检查服务器是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;
  });
}

【问题讨论】:

    标签: flutter dart null assertion


    【解决方案1】:

    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,需要等待才能使用生成的布尔值。您可能希望将其从小部件中取出并执行一次,因为它可能在运行时不应该更改,因为它正在获取包信息。

    【讨论】:

      【解决方案2】:

      您实际上并没有从getPackageInfo 返回值。 (返回语句在您传递给then 的函数中。)所以getPackageInfo 返回null 并且您测试它的if 语句失败。

      创建getPackageInfo async,删除then 并使用await PackageInfo.fromPlatform() - 它现在可以返回Future&lt;bool&gt;。当然,现在你必须等待结果,这在build 中是做不到的。

      考虑移动代码以获取当前包到有状态小部件(从initState 调用它)并简单地将布尔值传递给CalculatorHolder,而不是版本字符串。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-05
        • 2021-06-06
        • 2020-11-02
        • 1970-01-01
        • 1970-01-01
        • 2021-01-18
        • 1970-01-01
        • 2020-04-23
        相关资源
        最近更新 更多