Flutter集成instagram_basic_display_api后Android调试构建报错解决
故障根因
该问题是instagram_basic_display_api 1.0.1版本自身的构建脚本缺陷导致:包内的android/build.gradle硬编码了读取宿主项目Android目录下secret.properties文件的逻辑,属于包作者本地调试时遗留的未清理代码,既没有在包文档中说明需要手动创建该文件,也没有做文件不存在的兼容判断,直接在Gradle配置评估阶段抛出文件找不到的异常,连带触发Flutter SDK中flutter.gradle的级联报错。日文Locale下的乱码是系统原生文件不存在报错的编码(Shift-JIS)和Gradle日志默认编码(UTF-8)不匹配导致,和系统语言无直接关联。
因为问题出在第三方依赖包的自带脚本,不属于Flutter环境、Android工具链配置错误,所以flutter doctor -v检测会显示全部正常。
修复步骤
方案1:补全缺失配置文件(推荐,无需修改依赖包源码)
- 打开自身Flutter项目的
android目录(和项目级build.gradle、settings.gradle同级的根目录),手动新建名为secret.properties的文件,文件初始内容可以为空,直接保存即可。 - 如果之前已经从
pubspec.yaml中移除了instagram_basic_display_api依赖,先把依赖重新加回配置文件。 - 在项目根目录依次执行以下命令清理缓存后重新构建:
flutter clean flutter pub get flutter run
说明:该包读取
secret.properties原本是为了加载作者本地的签名配置,宿主项目创建空文件后,Properties加载逻辑不会抛出文件找不到异常,后续签名配置读取逻辑会自动走默认值,不影响包的正常功能使用。
方案2:修改依赖包构建脚本(兼容不需要创建额外文件的场景)
如果不想在项目中额外创建空配置文件,可以直接修改Pub缓存中对应包的构建脚本:
- 找到Pub缓存下的包路径:
- Windows系统默认路径:
C:\Users\本地用户名\AppData\Local\Pub\Cache\hosted\pub.dev\instagram_basic_display_api-1.0.1\android\ - Mac/Linux系统默认路径:
~/.pub-cache/hosted/pub.dev/instagram_basic_display_api-1.0.1/android/
- Windows系统默认路径:
- 打开该目录下的
build.gradle文件,定位到第29行附近读取secret.properties的代码块,将原有硬编码加载的逻辑:
def secrets = new Properties() secrets.load(new FileInputStream(rootProject.file("secret.properties")))
替换为带文件存在判断的兼容逻辑:
def secrets = new Properties() def secretPropsFile = rootProject.file("secret.properties") if (secretPropsFile.exists()) { secrets.load(new FileInputStream(secretPropsFile)) }
- 保存修改后,回到项目根目录执行
flutter clean后重新构建即可。
注意:该方法修改的是Pub缓存中的全局包文件,后续执行
flutter pub cache repair、切换Flutter版本、重新安装依赖时修改会被重置,需要重新操作。
之前操作无效的原因
之前执行flutter pub remove后问题仍存在,一般是操作后没有执行完整的flutter clean清理构建缓存,或者IDE、Gradle守护进程持有旧的构建配置导致,只要完整清理构建缓存后,移除依赖确实可以恢复正常构建,和故障根因的判断一致。
内容的提问来源于stack exchange,提问作者yolo

