Flutter Windows端运行Isar数据库测试报isar.dll访问拒绝错误
问题背景
在Flutter应用中编写CRUD测试用例,选用Isar Database作为本地数据库。相同测试代码在macOS环境可正常运行,但在Windows环境下运行时抛出Isar无访问权限、无法打开对应文件的错误。
测试代码
import 'dart:io'; import 'dart:math'; import 'package:flutter/foundation.dart'; import 'package:flutter_pill_cabinet/layers/data/models/reminder.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:isar/isar.dart'; // ignore: depend_on_referenced_packages import 'package:path/path.dart' as path; // Helper Methods for configuring the tests String? testTempPath; String getRandomName() { var random = Random().nextInt(pow(2, 32) as int).toString(); return '${random}_tmp'; } Future<Isar> openTempIsar(List<CollectionSchema<dynamic>> schemas, {String? name}) async { final dartToolDir = path.join(Directory.current.path, '.dart_tool'); testTempPath = path.join(dartToolDir, 'test', 'tmp'); return Isar.open( schemas: schemas, name: name ?? getRandomName(), directory: kIsWeb ? '' : testTempPath!, ); } void main() { group('Isar Experiment', () { late Isar isar; setUp(() async { await Isar.initializeIsarCore(download: true); isar = await openTempIsar( [ReminderSchema], ); }); test('Isar Test', () { assert(1 == 1); }); tearDown(() { isar.close(deleteFromDisk: true); }); }); }
核心报错
FileSystemException: Cannot open file, path = '\isar.dll' (OS Error: Access denied. , errno = 5)
问题原因
报错显示程序尝试在系统盘根目录写入isar.dll时被拒绝,核心原因是Windows环境下Isar自动下载核心动态库时,没有正确识别可写入的工作路径,默认尝试往权限受限的根目录写入文件,触发系统权限拦截;macOS默认用户目录权限管控更宽松,不会触发该问题。
解决方法
- 提前创建测试用临时目录:在
openTempIsar方法中,拼接完临时路径后先递归创建目录,避免因目录不存在触发写入错误,新增代码如下:
testTempPath = path.join(dartToolDir, 'test', 'tmp'); // 递归创建不存在的目录层级 await Directory(testTempPath!).create(recursive: true);
- 关闭Isar核心库自动下载逻辑:测试环境下不要使用
download: true参数自动拉取dll文件,Windows下该逻辑容易出现路径识别错误,可提前手动下载对应版本的isar.dll放到项目test目录,或直接引入isar_flutter_libs依赖自动打包对应平台的二进制文件,修改初始化代码:
setUp(() async { // 移除download: true参数 await Isar.initializeIsarCore(); isar = await openTempIsar( [ReminderSchema], ); });
- 检查项目存放路径:不要把Flutter项目放在C盘根目录、
Program Files等受UAC权限管控的系统路径下,移到当前用户的工作目录(如C:\Users\用户名\Projects)或非系统盘下再运行测试。 - 排查安全软件拦截:如果开启了Windows Defender受控文件夹访问或第三方杀毒软件,会拦截程序写入dll文件的行为,将Flutter SDK目录、项目目录加入安全软件排除列表即可。
内容的提问来源于stack exchange,提问作者snackster
相关产品推荐
相关产品推荐

