likes
comments
collection
share

[译]Flutter文件选择器组件file_picker(四)问题解决方案

作者站长头像
站长
· 阅读数 4

本文翻译自: Troubleshooting · miguelpruivo/flutter_file_picker Wiki · GitHub

版本: file_picker 4.3.3


Android

🐛 问题:

应用在发布模式下无法编译。

🛠 可能的解决方案:

请参考 #545,这里有一个相关的讨论,特别在此评论 你可能会发现一个解决方案。


🐛 问题:

如果遇到了如下的问题:

The built failed likely due to AndroidX incompatibilities in a plugin. The tool is about to try using Jetfier to solve the incompatibility.
Building plugin file_picker...

FAILURE: Build failed with an exception.

What went wrong:
A problem occurred configuring root project 'file_picker'.
SDK location not found. Define location with sdk.dir in the local.properties file or with an ANDROID_HOME environment variable.

🛠 可能的解决方案:

这可能是由于从旧工程迁移的模式有问题或者需要完整迁移到 Android X 支持。可以参考该官方指导或在该包的仓库中搜索相关的问题,然后你会找到一些不同的解决方案(因为不同的人有不同的版本)。这里有一个很详细的说明。

请不要由于编译兼容问题新建 issue ,因为在仓库中有很多类似的解决,你可以很容易地找到一个解决方案。


🐛 问题:

编译失败,带有信息 unexpected element <queries> found in <manifest>

🛠 可能的解决方案:

这是因为 <queries> 标签引入了新的用于 Android 11 及以上(SDK 30+)的包可见性的选项。因为这个,你需要升级你的 build.gradle ,指定包含该改动的版本。下面是支持的 gradle 选项的列表。

  • 3.3.3
  • 3.4.3
  • 3.5.4
  • 3.6.4
  • 4.0.1

也别忘了升级你的 gradle-wrapper.properties 中的 ditributionUrl 。例如:对于 gradle 4.0.1 , 就该是:

distributionUrl=https://services.gradle.org/distributions/gradle-6.1.1-all.zip

代码


🐛 问题:

选择文件时应用崩溃,带有一个 FilePickerDelegate 的 boolean NullPointerException :

E/AndroidRuntime( 1459): java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
E/AndroidRuntime( 1459): at com.mr.flutter.plugin.filepicker.FilePickerDelegate$2.run(FilePickerDelegate.java:92)
E/AndroidRuntime( 1459): at java.lang.Thread.run(Thread.java:919)

🛠 可能的解决方案:

该问题已被报告且在这里被广泛讨论,这是由于在不可能的地方触发了一个 NullPointerException 异常。在更深入地调查之后,这些情况主要像是在旧的 Flutter 版本上运行(可能是 1.12 @ stable channel 稳定版)。

这个问题可能只运行 flutter upgrade 并确认是运行的最新稳定版(现在是1.17.3)就可以修复。


🐛 问题:

由于一些原因,选取时会收到一个错误说权限已经在请求,选取器已经准备好了或类似的问题。

🛠 可能的解决方案:

不久前,有些报告说工程开始优先为 Android V2 嵌入,可能需要升级一些工程以无缝支持更新的插件。

参考 EdwynZN 关于 Flutter 权限处理器插件的回答,跟随以下官方指示升级 Flutter 1.12 之前的 Android 工程,感觉可以修复。

基本来说,如果 Android 工程的 MainActivity.java 或 kt (kotlin 版)在使用 io.flutter.app.FlutterActivity 或者 AndroidManifest.xml 在使用 io.flutter.app.FlutterActivity 或者

<meta-data
    android:name="io.flutter.app.android.SplashScreenUntilFirstFrame"
     android:value="true" />

你可能需要更新 Flutter 工程以和新的 Android 插件类型系统运转。


🐛 问题:

如果工程由于依赖丢失编译失败。尤其是 import androidx.lifecycle.DefaultLifecycleObserver; 未被识别时会发生。

🛠 可能的解决方案:

典型地这个问题发生是因为工程没有完全 支持 Android X 。请确认已经完整迁移,可以确认下官方指示或者可以检查下下面需要的内容是否已满足。

  1. 把工程的 android/app/build.gradle 里的 compileSdkVersion 和 targetSdkVersion 改为 28
  2. 在 android/gradle.properties 文件里添加下面的内容:
android.useAndroidX=true
android.enableJetifier=true

如果这些还不能解决问题,可能是有依赖冲突或者 向支持 V2 嵌入迁移得不对。要修复这个,按照下面步骤:

  1. 使用 flutter create 用相同的名称和依赖创建新的应用
  2. 复制代码时要谨慎,只复制需要的文件,特别是 android/ 目录
  3. 编译,此时一切应该就 OK 了。

🐛 问题:

我在通过 getDirectoryPath() 选择一个目录,但是它抛出错误或返回空路径。

🛠 可能的解决方案:

在 Android 上,有少量的目录不能手动选取后进行写操作,其中之一是下载目录,它可能只会返回空的路径(/)。


iOS

🐛 问题:

无法为 iOS 编译。在 XCode 上有一些 OBJC 符号错误或者其它奇怪的错误阻止编译成功。

🛠 可能的解决方案:

这通常是一个由于现有缓存导致的依赖解决问题。如果无法为 iOS 编译,可以不考虑插件的版本,做以下的步骤。

注意事项:  建议每次都去做一下,然后它能处理机器上已使用的空间。

  1. 在 project/ios 文件夹,运行 pod deintegrate && rm Podfile.lock && pod install
  2. 在工程文件夹下,运行 flutter clean
  3. 运行 rm -rf ~/Library/Developer/Xcode/DerivedData 清空 Xcode 衍生的数据
  4. 用 XCode 打开工程,并用 Cmd + Shift + K 清除
  5. 用 flutter build ios 命令编译

🐛 问题:

从相册选取多个文件时碰到了一个问题

🛠 可能的解决方案:

该插件使用 DKImagePickerController 作为依赖用于在相册中选取多个文件。因为 iOS SDK 的 ImagePickerController 不允许。于是,直接关联这个的任何问题都会在官方仓库上有记录。