Flutter重命名Dart文件大小写后VS Code导入重复包编译报错
问题描述
将Warehouse_edit_repository.dart重命名为warehouse_edit_repository.dart后,导入文件运行程序出现系列报错,已尝试重装VS Code、删除原有导入语句后重新导入、给导入加as关键字设置别名等方法,均无法解决问题。
报错信息
- 'WarehouseEditRepository/*1*/' is from 'package:bhoomi/data/repository/warehouse_edit_repository.dart' ('lib/data/repository/warehouse_edit_repository.dart'). - 'WarehouseEditRepository/*2*/' is from 'package:bhoomi/data/repository/Warehouse_edit_repository.dart' ('lib/data/repository/Warehouse_edit_repository.dart'). EditWarehouseBloc(editWarehouseRepository: WarehouseEditRepository()) ^ lib/screens/project_screens/purch_mgmt_screens/masters/warehouse_screen/warehouse_edit_screen.dart:178:14: Error: Type argument 'EditWarehouseBloc' doesn't conform to the bound 'BlocBase<S>' of the type variable 'B' on 'BlocConsumer'. - 'EditWarehouseBloc' is from 'package:bhoomi/bloc/warehouse_view_bloc/warehouse_view_bloc.dart' ('lib/bloc/warehouse_view_bloc/warehouse_view_bloc.dart'). - 'BlocBase' is from 'package:bloc/src/bloc.dart' ('/C:/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-7.2.1/lib/src/bloc.dart'). Try changing type arguments so that they conform to the bounds. child: BlocConsumer<EditWarehouseBloc, EditWarehouseState>( ^ /C:/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-7.3.3/lib/src/bloc_consumer.dart:61:20: Context: This is the type variable whose bound isn't conformed to. class BlocConsumer<B extends BlocBase<S>, S> extends StatefulWidget { ^ lib/screens/project_screens/purch_mgmt_screens/masters/warehouse_screen/warehouse_edit_screen.dart:702:58: Error: The argument type 'AddWarehouseModel/*1*/' can't be assigned to the parameter type 'AddWarehouseModel/*2*/'. - 'AddWarehouseModel/*1*/' is from 'package:bhoomi/data/model/add_warehouse_repository.dart' ('lib/data/model/add_warehouse_repository.dart'). - 'AddWarehouseModel/*2*/' is from 'package:bhoomi/data/model/add_Warehouse_repository.dart' ('lib/data/model/add_Warehouse_repository.dart'). model: model)); ^ FAILURE: Build failed with an exception. * Where: Script 'C:\flutter\packages\flutter_tools\gradle\flutter.gradle' line: 1102 * What went wrong: Execution failed for task ':app:compileFlutterBuildDebug'. > Process 'command 'C:\flutter\bin\flutter.bat'' finished with non-zero exit value 1 * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
问题根因
Windows默认NTFS、macOS默认APFS文件系统都是大小写不敏感的,直接在IDE里修改文件名大小写,操作系统不会识别为文件重命名操作,会导致新旧两个大小写不同的文件路径同时被Dart分析服务和Flutter构建缓存识别,最终出现同名类来自两个不同路径、类型无法匹配的连锁错误,后续Bloc泛型不匹配、Model参数类型不匹配都是这个问题引发的次生错误,重装IDE、加导入别名都没有触达根本问题。
解决步骤
按顺序执行以下操作即可修复:
- 停止所有正在运行的Flutter程序、Dart分析进程,在项目根目录执行
flutter clean,清理所有旧的编译缓存和构建产物 - 解决文件系统无法识别大小写重命名的问题,二选一即可:
- 无Git的场景:把需要改名的文件先改成完全不相关的中间名,比如把当前的
warehouse_edit_repository.dart先重命名为temp_warehouse_edit_repo.dart,等IDE索引完成后,再将其改回目标名称warehouse_edit_repository.dart;另一个出问题的add_Warehouse_repository.dart也按同样逻辑,先改中间名再改成目标名add_warehouse_repository.dart - 用Git管理代码的场景:直接执行Git强制重命名命令让版本库识别大小写变更,对应命令为
git mv -f lib/data/repository/Warehouse_edit_repository.dart lib/data/repository/warehouse_edit_repository.dart git mv -f lib/data/model/add_Warehouse_repository.dart lib/data/model/add_warehouse_repository.dart
- 无Git的场景:把需要改名的文件先改成完全不相关的中间名,比如把当前的
- 全局搜索项目内所有代码,把残留的旧路径引用(即包含
Warehouse_edit_repository.dart、add_Warehouse_repository.dart的导入语句)全部替换为新的全小写路径 - 在VS Code中按快捷键
Ctrl+Shift+P(macOS为Cmd+Shift+P),依次执行Dart: Restart Analysis Server和Flutter: Restart Flutter Daemon,重启Dart和Flutter的分析服务,清除IDE层面的缓存索引 - 在项目根目录执行
flutter pub get重新拉取依赖,之后正常编译运行即可
注意:不要用导入加
as别名的方式绕过这个问题,这种方式只是临时掩盖了两个路径同名类同时存在的问题,后续其他地方引用对应类时依然会触发同类报错。
内容的提问来源于stack exchange,提问作者Total Call
相关产品推荐
相关产品推荐

