'String' 不是类型 'bool' 的子类型
'String' is not a subtype of type 'bool'
这是一个使用数据库的待办事项列表应用程序。我正在使用布尔变量 isDone
将任务标记为已完成,但是当我添加新任务时,出现错误 'String' is not a subtype of type 'bool'
。我想将 isDone
的值更改为字符串,但我不确定我可以在哪里输入 .toString()
行。
尝试使用类似错误的解决方案(int、bool、future 不是 string、bool 等的子类型)但无法解决,因为这些错误是特定于应用程序的。
数据库代码:
//This is the database
String _itemName;
String _dateCreated;
int _id;
bool _isDone;
TodoItem(this._itemName, this._dateCreated, this._isDone);
TodoItem.map(dynamic obj) {
this._itemName = obj["itemName"];
this._dateCreated = obj["dateCreated"];
this._id = obj["id"];
this._isDone = obj["isDone"];
}
String get itemName => _itemName;
String get dateCreated => _dateCreated;
int get id => _id;
bool get isDone => _isDone;
Map<String, dynamic> toMap() {
var map = new Map<String, dynamic>();
map["itemName"] = _itemName;
map["dateCreated"] = _dateCreated;
map["isDone"] = _isDone;
if (_id != null) {
map["id"] = _id;
}
return map;
}
TodoItem.fromMap(Map<String, dynamic> map) {
this._itemName = map["itemName"];
this._dateCreated = map["dateCreated"];
this._id = map["id"];
this._isDone = map["isDone"];
}
数据库创建、更新功能:
注意:更新函数只应更改 isDone 的值
Future<bool> updateItem(TodoItem item) async {
var dbClient = await db;
int res = await dbClient.update("id", item.toMap(),
where: "id = ?", whereArgs: <bool>[item.isDone]);
return res > 0 ? true : false;
}
Future<int> saveItem(TodoItem item) async {
var dbClient = await db;
int res = await dbClient.insert("$tableName", item.toMap());
print(res.toString());
return res;
}
bool
是 not supported in SQLite。
可能发生的情况是 isDone
列值 true
被转换为字符串 "true"
因此它在您的 TodoItem.map
构造函数中崩溃。
尝试在插入之前或在查询参数中将值例如转换(并解析)为 1 或 0 (int)。
当 bool x = 代码中分配的字符串值时,Flutter 会出现此错误。不幸的是,在 Dart 中没有从字符串到布尔的转换。一个简单的技巧是放这样的东西
String test = "true";
bool isCorrect = test == 'true';
这按预期工作,因为代码会将字符串和布尔值作为字符串进行比较,return 结果作为布尔值。您可能需要根据您在上面代码第二行之前的字符串值使用 .toLowerCase() 或 .toUpperCase()。
这是一个使用数据库的待办事项列表应用程序。我正在使用布尔变量 isDone
将任务标记为已完成,但是当我添加新任务时,出现错误 'String' is not a subtype of type 'bool'
。我想将 isDone
的值更改为字符串,但我不确定我可以在哪里输入 .toString()
行。
尝试使用类似错误的解决方案(int、bool、future 不是 string、bool 等的子类型)但无法解决,因为这些错误是特定于应用程序的。
数据库代码:
//This is the database
String _itemName;
String _dateCreated;
int _id;
bool _isDone;
TodoItem(this._itemName, this._dateCreated, this._isDone);
TodoItem.map(dynamic obj) {
this._itemName = obj["itemName"];
this._dateCreated = obj["dateCreated"];
this._id = obj["id"];
this._isDone = obj["isDone"];
}
String get itemName => _itemName;
String get dateCreated => _dateCreated;
int get id => _id;
bool get isDone => _isDone;
Map<String, dynamic> toMap() {
var map = new Map<String, dynamic>();
map["itemName"] = _itemName;
map["dateCreated"] = _dateCreated;
map["isDone"] = _isDone;
if (_id != null) {
map["id"] = _id;
}
return map;
}
TodoItem.fromMap(Map<String, dynamic> map) {
this._itemName = map["itemName"];
this._dateCreated = map["dateCreated"];
this._id = map["id"];
this._isDone = map["isDone"];
}
数据库创建、更新功能:
注意:更新函数只应更改 isDone 的值
Future<bool> updateItem(TodoItem item) async {
var dbClient = await db;
int res = await dbClient.update("id", item.toMap(),
where: "id = ?", whereArgs: <bool>[item.isDone]);
return res > 0 ? true : false;
}
Future<int> saveItem(TodoItem item) async {
var dbClient = await db;
int res = await dbClient.insert("$tableName", item.toMap());
print(res.toString());
return res;
}
bool
是 not supported in SQLite。
可能发生的情况是 isDone
列值 true
被转换为字符串 "true"
因此它在您的 TodoItem.map
构造函数中崩溃。
尝试在插入之前或在查询参数中将值例如转换(并解析)为 1 或 0 (int)。
当 bool x = 代码中分配的字符串值时,Flutter 会出现此错误。不幸的是,在 Dart 中没有从字符串到布尔的转换。一个简单的技巧是放这样的东西
String test = "true";
bool isCorrect = test == 'true';
这按预期工作,因为代码会将字符串和布尔值作为字符串进行比较,return 结果作为布尔值。您可能需要根据您在上面代码第二行之前的字符串值使用 .toLowerCase() 或 .toUpperCase()。