【发布时间】:2023-03-17 23:45:01
【问题描述】:
好的,所以我不知道我做错了什么。我的应用程序无法按预期运行并出现此异常错误 -
E/flutter (14104): [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: LateInitializationError: Field '_database@22361766' has not been initialized.
E/flutter (14104): #0 DatabaseProvider._database (package:new_appointment/database/database.dart)
package:new_appointment/database/database.dart:1
E/flutter (14104): #1 DatabaseProvider.database
package:new_appointment/database/database.dart:15
E/flutter (14104): #2 ClientProvider.getClients
package:new_appointment/…/dataproviders/client_provider.dart:17
E/flutter (14104): #3 ClientRepository.getAllClients
package:new_appointment/…/repositories/client_repository.dart:7
E/flutter (14104): #4 ClientBloc.getClients
package:new_appointment/…/blocs/client_bloc.dart:16
E/flutter (14104): #5 new ClientBloc
package:new_appointment/…/blocs/client_bloc.dart:11
E/flutter (14104): #6 new _NewAppointmentState
package:new_appointment/…/screens/new_appointment.dart:22
E/flutter (14104): #7 NewAppointment.createState
package:new_appointment/…/screens/new_appointment.dart:18
看起来一切都是从 DatabaseProvider 开始的。这是它的代码:
final clientTABLE = 'ClientDetails';
class DatabaseProvider {
static final DatabaseProvider dbProvider = DatabaseProvider();
late Database _database;
Future<Database> get database async {
if (_database != null) return _database;
_database = await createDatabase();
return _database;
}
createDatabase() async {
Directory documentsDirectory = await getApplicationDocumentsDirectory();
String path = join(documentsDirectory.path, "Client.db");
var database = await openDatabase(path,
version: 1, onCreate: initDB);
return database;
}
Future initDB(Database database, int version) async {
await database.execute("CREATE TABLE IF NOT EXISTS $clientTABLE ("
"firstName VARCHAR, "
"lastName VARCHAR, "
"whatsappNo VARCHAR, "
"email VARCHAR PRIMARY KEY, "
"location VARCHAR, "
"projectName VARCHAR, "
")");
}
}
ClientProvider 看起来像这样:
class ClientProvider {
final dbProvider = DatabaseProvider.dbProvider;
Future<int> createClient(Client client) async {
final db = await dbProvider.database;
var result = db.insert(clientTABLE, client.toDatabaseJson());
return result;
}
Future<List<Client>> getClients({List<String>? columns, String? query}) async {
final db = await dbProvider.database;
List<Map<String, dynamic>> result = {} as List<Map<String, dynamic>>;
if (query != null) {
if (query.isNotEmpty)
result = await db.query(clientTABLE,
columns: columns,
where: 'firstName LIKE ?',
whereArgs: ["%$query%"]);
} else {
result = await db.query(clientTABLE, columns: columns);
}
List<Client> clients = result.isNotEmpty
? result.map((item) => Client.fromDatabaseJson(item)).toList()
: [];
return clients;
}
}
我只是想使用 sqflite 包将数据保存到 sqlite 本地数据库中。到目前为止,新添加的数据都不会显示在 UI 上,我也无法添加任何新数据。这个 LateInitializationError 每次都会弹出。
知道我在这里做错了什么吗?非常感谢您的帮助。
【问题讨论】:
-
if (_database != null)检查没有意义。如果_database未初始化,则检查将尝试从未初始化的变量中读取。如果您想知道_database是否已初始化,请将_database设为可空而不是late。 -
好的。所以我通过编写使 _database 可以为空:数据库? _数据库。另外,我删除了 if (_database != null) return _database 行。现在它出现了一个新错误 - E/flutter (14104): [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: type '_InternalLinkedHashMap
' is not a subtype类型转换中的 'List -
我上面提到的ClientProvider类里面会弹出这个错误
-
我的意思是
if-check 对于late变量没有意义;如果变量可以为空,则检查是适当的(并且可能应该在那里)。您的转换错误是一个单独的问题:{} as List<Map<String, dynamic>>;没有意义,因为{}是Map并且不能转换为List...
标签: flutter sqlite dart bloc sqflite