断言失败:布尔表达式不能为空(即使布尔变量分配给真/假)

Posted

技术标签:

【中文标题】断言失败:布尔表达式不能为空(即使布尔变量分配给真/假)【英文标题】:Failed assertion: boolean expression must not be null (even bool variable assigned to true/false) 【发布时间】:2021-07-09 15:34:08 【问题描述】:

我已经在Dart Flutter 中创建了这个应用程序WorldTime 应用程序,并且我得到一个重复的无法解释的错误Failed assertion: boolean expression must not be null,我试图搜索这个错误,我得到的只是bool 变量必须分配给true 或@ 987654326@。所以这是一段代码,其中我有一个 bool 变量,我试图使其等于 false/true,但它仍然给了我错误。 有 bool 变量的代码:

import 'dart:convert';
import 'package:http/http.dart';
import 'package:intl/intl.dart';

class WorldTime 
  String location;
  String time;
  String flag;
  String url;
  bool isMorning ;

  WorldTime(this.location, this.flag, this.url);

  Future<void> getTime() async 
    try 
      Response response =
          await get(Uri.https('worldtimeapi.org', 'api/timezone/$url'));
      Map data = jsonDecode(response.body);

      String datetime = data['datetime'];
      String offset = data['utc_offset'].substring(0, 3);
      String offset_mnt = data['utc_offset'].substring(4, 6);

      DateTime now = DateTime.parse(datetime);
      now = now.add(
          Duration(hours: int.parse(offset), minutes: int.parse(offset_mnt)));

      isMorning = now.hour > 6 && now.hour < 20 ? true : false;

      time = DateFormat.jm().format(now);
     catch (e) 
      print("Error occured: $e");
      time = "Cannot Display Time Due to Error Occured";
    
  

完整的代码链接和文件在我的 GitHub 存储库中 Link:WorldTimeApp

我的应用还需要active internet connection,所以我保证我有活跃的互联网来从 API 获取详细信息仍然得到同样的错误

任何帮助将不胜感激:)

【问题讨论】:

不确定是否是问题所在,但您从未使用任何值初始化 isMorning。由于您使用bool 作为类型,这是一个问题,因为它最终会得到不允许的值null @julemand101 我试图分配isMorning = true/false,但发生了同样的错误:( 在 home.dart 中你有 String bgImg = data['isMorning'] ? 'Day.jpeg' : 'Night.jpeg'; 但我没有看到 "isMorning" 在启动应用程序时被添加到 data 中。这首先在 Scaffold 的创建中的 home.dart 中完成。所以data['isMorning'] 正确返回null 【参考方案1】:

我猜,您的 api 调用可能失败,因此您的布尔标志 (isMorning) 从未初始化。可能的修复

在调用 api 之前尝试初始化变量

尝试在 catch 块中将 isMorning 标志设置为 true 或 false

或尝试检查 null,然后进行布尔检查。例如,

 bool _isMorning = data['isMorning'] != null && data['isMorning'] != false;
 String bgImg = _isMorning ? 'Day.jpeg' : 'Night.jpeg';
 Color colors = _isMorning ? Colors.blue[50] : Colors.blueGrey[800];

【讨论】:

以上是关于断言失败:布尔表达式不能为空(即使布尔变量分配给真/假)的主要内容,如果未能解决你的问题,请参考以下文章

如何单元测试继续断言

javascript 判断变量 是否为空null,undefined, 空数组,空对象(空Object),字符串是否为空或全由空白字符组成,数字是否为0,布尔是否为false。

Python3 unittest断言详解

Java断言(Assertion)

为什么即使分配了默认的mysql值,布尔属性也保存为null

为啥我无法将程序中找到的布尔结果的正确值分配给布尔变量并使用结果检查条件?