Почему не удаётся создать базу данных с помощью Drift в Dart?

Столкнулся впервые с проблемой при создании базы данных с помощью drift: на строке <br/> class AppDb extends _$AppDb <br/> возникает ошибка "classes can only extend other classes". Все зависимости и импорты подключены. Ниже — код класса и таблицы: <pre><code>import 'dart:io';
  • 23 июля 2026 г. 16:02
Ответы на вопрос 1
Коротко: ошибка "classes can only extend other classes" обычно означает, что _$AppDb в момент анализа не является классом (или вовсе не определён). Это происходит, когда сгенерированный файл отсутствует или не подключён. В drift _$AppDb — это класс, который создаёт кодогенератор (drift_dev), поэтому нужно правильно подключить part‑файл и запустить build_runner.

Проверьте и исправьте по пунктам:

1) В файле с базой данных должен быть директива part с правильным именем файла:
- если ваш файл называется lib/src/app_db.dart, то добавьте
  part 'app_db.g.dart';
(директива должна указывать на .g.dart файл рядом с текущим файлом).

2) Аннотация и класс должны выглядеть примерно так:
import 'dart:io';
import 'package:drift/drift.dart';
import 'package:drift/native.dart';

part 'app_db.g.dart';

@DriftDatabase(tables: [Tasks])
class AppDb extends _$AppDb {
  AppDb() : super(_openConnection());

  @override
  int get schemaVersion => 1;
}

3) Пример таблицы:
class Tasks extends Table {
  IntColumn get id => integer().autoIncrement()();
  TextColumn get name => text()();
}

4) Добавьте dev-зависимости в pubspec.yaml и запустите кодогенерацию:
dev_dependencies:
  drift_dev: ^x.y.z
  build_runner: ^x.y.z

Запуск:
- для Flutter: flutter pub run build_runner build --delete-conflicting-outputs
- для pure Dart: dart run build_runner build --delete-conflicting-outputs

5) Проверьте результат:
- После успешного выполнения у вас появится файл app_db.g.dart с объявлением class _$AppDb extends GeneratedDatabase { ... }.
- Если файл не появился — посмотрите вывод build_runner на ошибки (чаще всего проблемы с импортами/аннотациями/ошибками синтаксиса в таблицах).

Доп. распространённые ошибки
- Неправильное имя в part (частая причина).
- Не установлены drift_dev / build_runner в dev_dependencies.
- Не помечены таблицы/база аннотациями (@DriftDatabase).
- Конфликты сборки — используйте флаг --delete-conflicting-outputs.

Если после этого не получится, пришлите:
- полный файл с классом базы (включая part '...';),
- имя файла (чтобы проверить соответствие part),
- вывод build_runner — помогу точнее.
Похожие вопросы