You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter使用sqflite出现LateInitializationError数据库未初始化错误如何解决

问题根因与修复方案

报错核心由以下几个代码错误导致:

  • 对late修饰的_database变量做非空判断:late修饰的非空类型变量在未初始化时直接访问会直接抛出初始化异常,不会返回null,原有判断逻辑完全失效
  • 建表SQL语法错误:projectName VARCHAR字段后多了多余的逗号,会导致表创建失败
  • createClient方法中调用db.insert未加await,无法正常拿到插入结果
  • getClients方法中result初始化逻辑错误,强制将空Map转为List会触发类型转换异常

修复后的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!;
  }

  Future<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;
    // 增加await等待插入操作完成
    var result = await 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 = [];
    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;
  }
}

内容的提问来源于stack exchange,提问作者Divyam Dhadwal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 13:54:05