DatabaseConnection.delayed constructor

DatabaseConnection.delayed(
  1. FutureOr<DatabaseConnection> connection
)

Database connection that is instantly available, but delegates work to a connection only available through a Future.

This can be useful in scenarios where you need to obtain a database instance synchronously, but need an async setup. A prime example here is DriftIsolate:

@DriftDatabase(...)
class MyDatabase extends _$MyDatabase {
  MyDatabase._connect(DatabaseConnection c): super.connect(c);

  factory MyDatabase.fromIsolate(DriftIsolate isolate) {
    return MyDatabase._connect(
      // isolate.connect() returns a future, but we can still return a
      // database synchronously thanks to DatabaseConnection.delayed!
      DatabaseConnection.delayed(isolate.connect()),
    );
  }
}

Implementation

factory DatabaseConnection.delayed(FutureOr<DatabaseConnection> connection) {
  if (connection is DatabaseConnection) {
    return connection;
  }

  return DatabaseConnection(
    SqlTypeSystem.defaultInstance,
    LazyDatabase(() async => (await connection).executor),
    DelayedStreamQueryStore(connection.then((conn) => conn.streamQueries)),
  );
}