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

Flutter集成测试中sqflite的openDatabase无法完成执行怎么办?

解决Flutter集成测试中sqflite的openDatabase阻塞问题

问题原因

在Flutter widget测试/集成测试环境下,原生sqflite依赖Android/iOS的原生数据库驱动,而测试环境没有完整的原生支持,导致openDatabase调用阻塞无法完成。

解决方案

使用sqflite_common_ffi提供的纯Dart数据库实现适配测试环境,同时调整测试流程确保App初始化完成:

1. 添加测试依赖

在pubspec.yaml的dev_dependencies中添加:

dev_dependencies:
  sqflite_common_ffi: ^2.3.0

2. 修改测试代码

import 'package:flutter_test/flutter_test.dart';
import 'package:our_habits/my_app.dart';
import 'package:sqflite/sqflite.dart';
import 'package:sqflite_common_ffi/sqflite_ffi.dart';

void main() {
  setUpAll(() {
    // 初始化sqflite的FFI实现,适配测试环境
    sqfliteFfiInit();
    databaseFactory = databaseFactoryFfi;
  });

  testWidgets("Test sqflite database", (WidgetTester tester) async {
    print("start");
    // 加载App并等待所有异步初始化完成
    await tester.pumpWidget(const MyApp());
    await tester.pumpAndSettle();
    print("pumpWidget is done");

    final db = await openDatabase(
      inMemoryDatabasePath,
      version: 1,
      onCreate: (Database db, int version) async {
        // 若需创建表,确保这里的异步操作执行完成
        // 示例:await db.execute('CREATE TABLE habits (id INTEGER PRIMARY KEY)');
      },
    );
    // 测试完成后关闭数据库,避免资源泄漏
    await db.close();
    print("end");
  });
}

关键调整点

  • 初始化FFI实现:在测试启动时设置使用纯Dart的数据库工厂,绕过原生环境依赖。
  • pumpAndSettle:等待App中所有异步操作(如内部数据库初始化)完成,避免测试中的数据库操作与App初始化冲突。
  • 关闭数据库:测试结束后关闭数据库,防止后续测试出现资源占用问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 23:33:30