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

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,这些依赖在编译时触发了类型未定义错误。解决步骤如下:

  1. 移除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';
    
  2. 可选:添加跨平台条件分支(如需同时支持原生+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);
        }));
      }
    }
    
  3. 清理缓存并重新构建

    • 执行flutter clean清理项目缓存
    • 重新生成Drift代码:dart run build_runner build
    • 重新运行Web项目:flutter run -d chrome

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 05:54:56