【问题标题】:why does this Dart code give "The operand can't be null, so the condition is always true. Remove the condition"?为什么这个 Dart 代码给出“操作数不能为空,所以条件始终为真。删除条件”?
【发布时间】:2021-10-25 00:34:23
【问题描述】:

为什么这个 Dart 代码给出“操作数不能为空,所以条件总是为真。删除条件”?

import 'package:sqflite/sqflite.dart';

class DatabaseHelper {
  static final DatabaseHelper instance = DatabaseHelper._privateConstructor();
  static late Database _database;

  DatabaseHelper._privateConstructor();

  Future<Database> get database async {
    if (_database != null) return _database;  // HERE: "The operand can't be null, so the condition is always true. Remove the condition"
    _database = await _initDatabase();
    return _database;
  }

  Future<Database> _initDatabase() async {
    Database _db = await openDatabase('my_db.db');
    return _db;
  }

}

【问题讨论】:

  • 你对错误信息的理解到底是什么?

标签: flutter dart sqflite


【解决方案1】:

因为检查 _database 是否为 null 是多余的,因为您将其声明为

static late Database _database;

Database这里是不可为空的类型,所以不能为空。

为了清楚起见,这是一个警告而不是错误。


要重构您的代码,请将 _database 变量声明为可为空

static Database? _database;

和你的database getter 一样

Future<Database> get database async {
  final Database? instance = _database;
  if (instance != null) return instance;
  instance = await _initDatabase();
  _database = instance;
  return instance;
}

【讨论】:

  • 谢谢 - 您认为将其设为可空比将其标记为“迟到”更好吗?看起来会更好/更健壮吗?
  • 哦——刚刚提到的实例在你的例子中必须是非最终的,当你把它放入 vscode fyi时
  • 如果使用late,则无法检查该字段是否已初始化。所以在这种情况下,使用可空类型将是正确的选择,因为您可以通过检查字段是否为空来检查该字段是否已初始化。
【解决方案2】:

这是因为你在定义_database的时候,特意把它定义为non-nulable:

static late Database _database;

如果它是一个可以为空的,你会添加“?”

static late Database? _database;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-25
    • 1970-01-01
    相关资源
    最近更新 更多