Flutter使用sqflite遇MissingPluginException异常求助
解决Flutter中sqflite的MissingPluginException异常
报错信息
Error: MissingPluginException(No implementation found for method getDatabasesPath on channel com.tekartik.sqflite) C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart 266:49 throw_ packages/flutter/src/services/platform_channel.dart 294:7 _invokeMethod C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 45:50 <fn> C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/async/zone.dart 1653:54 runUnary C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/async/future_impl.dart 147:18 handleValue C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/async/future_impl.dart 766:44 handleValueCallback C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/async/future_impl.dart 795:13 _propagateToListeners C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/async/future_impl.dart 566:5 [_completeWithValue] C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/async/future_impl.dart 639:7 callback C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/async/schedule_microtask.dart 40:11 _microtaskLoop C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/async/schedule_microtask.dart 49:5 _startMicrotaskLoop C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 166:15 <fn> Error: MissingPluginException(No implementation found for method openDatabase on channel com.tekartik.sqflite) C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart 266:49 throw_ packages/flutter/src/services/platform_channel.dart 294:7 _invokeMethod C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 45:50 <fn> C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/async/zone.dart 1399:47 _rootRunUnary C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/async/zone.dart 1300:19 runUnary C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/async/future_impl.dart 147:18 handleValue C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/async/future_impl.dart 766:44 handleValueCallback C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/async/future_impl.dart 795:13 _propagateToListeners C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/async/future_impl.dart 566:5 [_completeWithValue] C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/async/future_impl.dart 639:7 <fn> C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/async/zone.dart 1391:13 _rootRun C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/async/zone.dart 1293:19 run C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/async/zone.dart 1225:23 callback C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/async/schedule_microtask.dart 40:11 _microtaskLoop C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/async/schedule_microtask.dart 49:5 _startMicrotaskLoop C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 166:15 <fn>
我的数据库类
import 'dart:async'; import 'package:flutter_app/Book.dart'; import "package:sqflite/sqflite.dart"; import "package:path/path.dart"; class db_helper { Database? conn; Future<Database?> get dbConn async { if (conn == null) { conn = await connectDB(); }else{ return conn; } return conn; } Future<Database?> connectDB() async { String path = join(await getDatabasesPath().toString(), "library.db"); var connection = openDatabase("library.db", version: 2, onCreate: createDB); return connection; } FutureOr<void> createDB(Database db, int version) async { Database? conn = await this.dbConn; return await conn?.execute("create table books (id text not null unique, name text not null)"); } Future<List<Book>> getBooks() async { Database? conn = await this.dbConn; List<Book> booksList = conn?.query("books") as List<Book>; return List.generate(booksList.length, (i) { return Book( booksList[i].id, booksList[i].name ); }); } Future<void> addBook(Map<String, String> book) async { Database? conn = await this.dbConn; await conn?.insert("books", book); conn?.close(); } }
pubspec.yaml配置
name: flutter_app description: A new Flutter application. publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: sdk: '>=2.18.4 <3.0.0' dependencies: flutter: sdk: flutter path: ^1.8.2 sqflite: ^2.2.0+3 cupertino_icons: ^1.0.2 dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^2.0.0 flutter: uses-material-design: true
解决步骤
1. 确认运行环境
sqflite仅支持Android、iOS和macOS平台,不支持Web。如果当前是在Web浏览器中运行项目,必然会触发该异常,切换到Android/iOS模拟器或真机即可。
2. 重置依赖并重启项目
- 执行命令清理缓存:
flutter clean - 重新拉取依赖:
flutter pub get - 完全关闭IDE和模拟器/真机,重新打开后再运行项目
3. 修复数据库类代码中的错误
3.1 修正数据库路径获取
getDatabasesPath()是异步方法,不能直接调用toString(),应先await获取路径,再拼接数据库文件名:
Future<Database?> connectDB() async { String path = join(await getDatabasesPath(), "library.db"); var connection = openDatabase(path, version: 2, onCreate: createDB); return connection; }
3.2 修正建表逻辑
createDB方法不需要再调用dbConn,直接使用传入的db参数执行建表语句,避免循环调用:
FutureOr<void> createDB(Database db, int version) async { await db.execute("create table books (id text not null unique, name text not null)"); }
3.3 修正数据查询映射
query方法返回的是List<Map<String, dynamic>>,不能直接强制转换为List<Book>,需手动映射为实体类:
Future<List<Book>> getBooks() async { Database? conn = await this.dbConn; List<Map<String, dynamic>> maps = await conn!.query("books"); return List.generate(maps.length, (i) { return Book( maps[i]['id'] as String, maps[i]['name'] as String ); }); }
3.4 移除不必要的连接关闭操作
addBook方法中不要关闭数据库连接,单例连接应保持长期可用,关闭后后续操作会报错:
Future<void> addBook(Map<String, String> book) async { Database? conn = await this.dbConn; await conn?.insert("books", book); }
4. 版本兼容性检查
当前Flutter SDK 2.18.4与sqflite 2.2.0+3版本兼容,若上述操作后仍有问题,可尝试升级sqflite至最新兼容版本(执行flutter pub upgrade sqflite)。
内容的提问来源于stack exchange,提问作者user20503448
相关产品推荐
相关产品推荐

