为什么这段Dart代码提示“操作数不能为null,因此条件始终为真,请移除条件”
告警原因
你声明的全局_database变量是非空Database类型,同时用了late关键字修饰,Dart空安全规则下,非空类型的变量永远不可能为null,所以你写的if (_database != null)判空条件永远成立,完全没有存在的必要,编辑器才会抛出这个告警。
这里要注意late的作用只是告诉编译器“我会在第一次访问这个变量之前完成赋值,你不用提前检查我有没有赋值”,但它不会改变变量的非空属性,也不会让变量可以为null,所以针对这个变量的判空逻辑完全是多余的。
修复方案
推荐采用社区通用的可空类型写法,逻辑最稳妥:
方案1:将_database改为可空类型
把_database的声明改为可空的Database?类型,保留原有的判空逻辑,只需要在返回的时候加上非空断言(你已经提前判空,所以断言不会有崩溃风险):
import 'package:sqflite/sqflite.dart'; class DatabaseHelper { static final DatabaseHelper instance = DatabaseHelper._privateConstructor(); // 改为可空类型 static Database? _database; DatabaseHelper._privateConstructor(); Future<Database> get database async { // 判空逻辑现在是合法的 if (_database != null) return _database!; _database = await _initDatabase(); return _database!; } Future<Database> _initDatabase() async { Database _db = await openDatabase('my_db.db'); return _db; } }
方案2:保留late关键字,新增初始化标记
如果你不想改成可空类型,可以新增一个bool变量标记数据库是否完成初始化,替代原来的判空逻辑:
import 'package:sqflite/sqflite.dart'; class DatabaseHelper { static final DatabaseHelper instance = DatabaseHelper._privateConstructor(); static late Database _database; // 新增初始化状态标记 static bool _isInitialized = false; DatabaseHelper._privateConstructor(); Future<Database> get database async { if (_isInitialized) return _database; _database = await _initDatabase(); _isInitialized = true; return _database; } Future<Database> _initDatabase() async { Database _db = await openDatabase('my_db.db'); return _db; } }
内容的提问来源于stack exchange,提问作者Greg
相关产品推荐
相关产品推荐

