我是一个新的Flutter学习者谁目前正在学习通过视频https://www.youtube.com/watch?v=pQSTgf-6hDk&t=451s。我尝试定义createTask()函数,但它存在错误Undefined name ''从第43行开始,直到第64行。尝试将名称更正为已定义的名称,或定义名称。我已经在底部定义了名称,但它仍然显示消息红线,任何人都可以帮助我识别错误并提出解决它的建议。感谢你的帮助,谢谢。
下面是代码附件:
import 'package:flutter/material.dart';
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path_provider/path_provider.dart';
class DatabaseAlreadyOpenException implements Exception {}
class UnableToGetDocumentException implements Exception {}
class DatabaseIsNotOpenException implements Exception {}
class CouldNotDeleteUserException implements Exception {}
class UserAlreadyExistException implements Exception {}
class CouldNotFindUserException implements Exception {}
class TaskService {
Database? _db;
Database _getDatabaseOrThrow() {
final db = _db;
if (db == null) {
throw DatabaseIsNotOpenException();
} else {
return db;
}
}
Future<DatabaseTask> createTask({required DatabaseUser owner}) async {
final db = _getDatabaseOrThrow();
final dbUser = await getUser(email: owner.email);
// make sure owner exists in the database with the correct id
if (dbUser != owner) {
throw CouldNotFindUserException();
}
// create the task
final noteId = await db.insert(taskTable, {
userIdColumn: owner.id,
titleColumn: title,
noteColumn: note,
isCompletedColumn: isCompleted,
dateColumn: date,
startTimeColumn: startTime,
endTime: endTime,
color: color,
remind: remind,
repeat: repeat
});
final task = DatabaseTask(
id: noteId,
userId: owner.id,
title: title,
note: note,
isCompleted: isCompleted,
date: date,
startTime: startTime,
endTime: endTime,
color: color,
remind: remind,
repeat: repeat,
);
return task;
}
Future<DatabaseUser> getUser({required String email}) async {
final db = _getDatabaseOrThrow();
final results = await db.query(
userTable,
limit: 1,
where: 'email = ?',
whereArgs: [email.toLowerCase()],
);
if (results.isEmpty) {
throw CouldNotFindUserException();
} else {
return DatabaseUser.fromRow(results.first);
}
}
Future<DatabaseUser> createUser({required String email}) async {
final db = _getDatabaseOrThrow();
final results = await db.query(userTable,
limit: 1, where: 'email = ?', whereArgs: [email.toLowerCase()]);
if (results.isNotEmpty) {
throw UserAlreadyExistException();
}
final userId = await db.insert(userTable, {
emailColumn: email.toLowerCase(),
});
return DatabaseUser(id: userId, email: email);
}
Future<void> deleteUser({required String email}) async {
final db = _getDatabaseOrThrow();
final deletedCount = await db.delete(
userTable,
where: 'email = ?',
whereArgs: [email.toLowerCase()],
);
if(deletedCount != 1){
throw CouldNotDeleteUserException();
}
}
Future<void> close() async {
final db = _db;
if (db == null) {
throw DatabaseIsNotOpenException();
} else {
await db.close();
_db = null;
}
}
Future<void> open() async {
if (_db != null) {
throw DatabaseAlreadyOpenException();
}
try {
final docsPath = await getApplicationDocumentsDirectory();
final dbPath = join(docsPath.path, dbName);
final db = await openDatabase(dbPath);
_db = db;
await db.execute(createUserTable);
await db.execute(createTaskTable);
} on MissingPlatformDirectoryException {
throw UnableToGetDocumentException();
}
}
}
@immutable
class DatabaseUser {
final int id;
final String email;
const DatabaseUser({required this.id, required this.email});
// read hash table for every row, every user inside the database represented by object of map of String and an optional object
DatabaseUser.fromRow(Map<String, Object?> map)
: id = map[idColumn] as int,
email = map[emailColumn] as String;
@override
String toString() => 'Person, ID = $id, email = $email';
@override
bool operator ==(covariant DatabaseUser other) => id == other.id;
// id is primary key of class
@override
int get hashCode => id.hashCode;
}
class DatabaseTask {
final int id;
final int userId;
final String title;
final String note;
final int isCompleted;
final String date;
final String startTime;
final String endTime;
final int color;
final int remind;
final String repeat;
DatabaseTask(
{required this.id,
required this.userId,
required this.title,
required this.note,
required this.isCompleted,
required this.date,
required this.startTime,
required this.endTime,
required this.color,
required this.remind,
required this.repeat});
DatabaseTask.fromRow(Map<String, Object?> map)
: id = map[idColumn] as int,
userId = map[userIdColumn] as int,
title = map[titleColumn] as String,
note = map[noteColumn] as String,
isCompleted = map[isCompletedColumn] as int,
date = map[dateColumn] as String,
startTime = map[startTimeColumn] as String,
endTime = map[endTimeColumn] as String,
color = map[colorColumn] as int,
remind = map[remindColumn] as int,
repeat = map[repeatColumn] as String;
@override
String toString() =>
'Task, ID = $id, userID =$userId , title = $title, note = $note, isCompleted = $isCompleted, date = $date, startDate = $startTime, endTime = $endTime, color = $color, remind = $remind, repeat = $repeat';
@override
bool operator ==(covariant DatabaseTask other) => id == other.id;
// id is primary key of class
@override
int get hashCode => id.hashCode;
}
const dbName = 'tasks.db';
const taskTable = 'task';
const userTable = 'user';
const idColumn = 'id';
const emailColumn = 'email';
const userIdColumn = 'user_id';
const titleColumn = 'title';
const noteColumn = 'note';
const isCompletedColumn = 'isCompleted';
const dateColumn = 'date';
const startTimeColumn = 'startTime';
const endTimeColumn = 'endTime';
const colorColumn = 'color';
const remindColumn = 'remind';
const repeatColumn = 'repeat';
const createUserTable = ''' CREATE TABLE IF NOT EXISTS "user" (
"id" INTEGER NOT NULL,
"email" STRING NOT NULL UNIQUE,
PRIMARY KEY("id" AUTOINCREMENT)
);
''';
const createTaskTable = ''' CREATE TABLE IF NOT EXISTS "tasks" (
"id" INTEGER NOT NULL,
"user_id" INTEGER NOT NULL,
"title" STRING,
"note" STRING,
"isCompleted" INTEGER,
"date" STRING,
"startTime" STRING,
"endTime" STRING,
"color" INTEGER,
"remind" INTEGER,
"repeat" STRING,
FOREIGN KEY("user_id") REFERENCES "user"("id"),
PRIMARY KEY("id" AUTOINCREMENT)
);
''';
enter image description hereenter image description here
我试着重写,但结果还是一样。只有当你写回之前定义的相同名称时,红线才会消失(E。g. title列:title列,注意列:noteColumn,)。请帮我调试错误并提供解决方案给我。谢谢!enter image description here
1条答案
按热度按时间9rygscc11#
这些属性不在类
TaskService
中定义,它们在类DatabaseTask
中定义你也可以在
TaskService
中定义它们,或者在createTask
方法中将其作为参数。但是无论如何,您需要在某个地方设置值,以便在insert语句和DatabaseTask
构造函数中设置值。