Flutter Web集成Drift数据存储时遭遇Unsupported type错误求助
问题:Flutter Web中Drift配置出现FFI相关类型错误
按照Drift官方Web配置步骤操作后,运行Flutter Web项目时出现一系列FFI相关的类型未定义错误,示例错误如下:
../../../AppData/Local/Pub/Cache/hosted/pub.dev/ffi-2.1.2/lib/src/utf16.dart:68:22: Error: 'Pointer' isn't a type. static int _length(Pointer<Uint16> codeUnits) { ^^^^^^^ ../../../AppData/Local/Pub/Cache/hosted/pub.dev/ffi-2.1.2/lib/src/utf16.dart:93:33: Error: 'Allocator' isn't a type. Pointer<Utf16> toNativeUtf16({Allocator allocator = malloc}) { ^^^^^^^^^ ../../../AppData/Local/Pub/Cache/hosted/pub.dev/ffi-2.1.2/lib/src/utf16.dart:95:19: Error: 'Uint16' isn't a type. final Pointer<Uint16> result = allocator<Uint16>(units.length + 1); ^^^^^^ ../../../AppData/Local/Pub/Cache/hosted/pub.dev/ffi-2.1.2/lib/src/utf16.dart:95:11: Error: 'Pointer' isn't a type. final Pointer<Uint16> result = allocator<Uint16>(units.length + 1); ^^^^^^^ ../../../AppData/Local/Pub/Cache/hosted/pub.dev/ffi-2.1.2/lib/src/utf16.dart:95:46: Error: 'Uint16' isn't a type. final Pointer<Uint16> result = allocator<Uint16>(units.length + 1); ^^^^^^
当前使用的database.dart代码如下:
import 'package:drift/drift.dart'; import 'dart:io'; import 'package:drift/native.dart'; import 'package:path_provider/path_provider.dart'; import 'package:path/path.dart' as p; import 'package:sqlite3/sqlite3.dart'; import 'package:sqlite3_flutter_libs/sqlite3_flutter_libs.dart'; import 'dart:async'; import 'package:drift/wasm.dart'; import 'package:flutter/foundation.dart'; part 'database.g.dart'; class TodoItems extends Table { IntColumn get id => integer().autoIncrement()(); TextColumn get title => text().withLength(min: 6, max: 32)(); TextColumn get content => text().named('body')(); IntColumn get category => integer().nullable().references(TodoCategory, #id)(); DateTimeColumn get createdAt => dateTime().nullable()(); } class TodoCategory extends Table { IntColumn get id => integer().autoIncrement()(); TextColumn get description => text()(); } @DriftDatabase(tables: [TodoItems, TodoCategory]) class AppDatabase extends _$AppDatabase { AppDatabase() : super(_connect()); @override int get schemaVersion => 1; } DatabaseConnection _connect() { return DatabaseConnection.delayed(Future(() async { final db = await WasmDatabase.open( databaseName: 'sample', sqlite3Uri: Uri.parse('sqlite3.wasm'), driftWorkerUri: Uri.parse('drift_worker.js'), ); if (db.missingFeatures.isNotEmpty) { debugPrint('Using ${db.chosenImplementation} due to unsupported ' 'browser features: ${db.missingFeatures}'); } return db.resolvedExecutor; })); }
已将drift_worker.js和sqlite3.wasm放入web目录,但错误仍存在。
解决方案
错误核心原因:代码中引入了仅适用于原生平台(iOS/Android/Desktop)的FFI相关依赖,而Flutter Web不支持FFI,这些依赖在编译时触发了类型未定义错误。解决步骤如下:
移除Web不兼容的导入语句
删除代码中所有针对原生平台的import:import 'dart:io'; import 'package:drift/native.dart'; import 'package:path_provider/path_provider.dart'; import 'package:path/path.dart' as p; import 'package:sqlite3/sqlite3.dart'; import 'package:sqlite3_flutter_libs/sqlite3_flutter_libs.dart';可选:添加跨平台条件分支(如需同时支持原生+Web)
如果需要项目兼容多平台,可通过kIsWeb标记区分平台逻辑,确保原生代码仅在非Web环境下编译执行:DatabaseConnection _connect() { if (kIsWeb) { // Web平台Wasm连接逻辑 return DatabaseConnection.delayed(Future(() async { final db = await WasmDatabase.open( databaseName: 'sample', sqlite3Uri: Uri.parse('sqlite3.wasm'), driftWorkerUri: Uri.parse('drift_worker.js'), ); if (db.missingFeatures.isNotEmpty) { debugPrint('Using ${db.chosenImplementation} due to unsupported ' 'browser features: ${db.missingFeatures}'); } return db.resolvedExecutor; })); } else { // 原生平台连接逻辑 return DatabaseConnection.delayed(Future(() async { final dbFolder = await getApplicationDocumentsDirectory(); final dbPath = p.join(dbFolder.path, 'sample.db'); final nativeDb = sqlite3.open(dbPath); return NativeDatabase(nativeDb); })); } }清理缓存并重新构建
- 执行
flutter clean清理项目缓存 - 重新生成Drift代码:
dart run build_runner build - 重新运行Web项目:
flutter run -d chrome
- 执行
内容的提问来源于stack exchange,提问作者MarvinKweyu
相关产品推荐
相关产品推荐

