Flutter使用open_file_plus抛出异常:找不到符号 public static void registerWith(PluginRegistry.Registrar registrar
·
错误信息
What went wrong:
Execution failed for task ':open_file_plus:compileDebugJavaWithJavac'.
Compilation failed; see the compiler output below.
C:\Users\root\AppData\Local\Pub\Cache\hosted\pub.dev\open_file_plus-3.4.1+1\android\src\main\java\com\joutvhu\openfile\OpenFilePlusPlugin.java:66: 错误: 找不到符号
public static void registerWith(PluginRegistry.Registrar registrar) {
^
符号: 类 Registrar
位置: 接口 PluginRegistry
问题根源分析
经典的 Flutter V1 embedding 和 V2 embedding API 冲突的标志。
简单来说:
- V1 Embedding (旧版): 这是老版本 Flutter 项目使用的原生集成方式。它使用一个叫做 PluginRegistry.Registrar 的类来注册插件。
- V2 Embedding (新版): 这是当前所有新创建的 Flutter 项目使用的标准。它不再使用
PluginRegistry.Registrar,而是有一套更现代、更灵活的 API。
open_file_plus 插件的某部分代码(为了兼容旧项目)仍然包含了 V1 的注册方法 registerWith(...)。但是,你的主项目很可能是一个 V2 embedding 项目,它的环境中根本不存在 PluginRegistry.Registrar 这个类,因此编译器在编译 open_file_plus 的原生代码时报错“找不到符号”。
这个问题通常发生在你有一个较新的 Flutter 项目,但由于某些原因(例如,从旧项目迁移代码或配置不完整),导致了这种 API 不匹配。
解决方案:项目完全迁移到 V2 Embedding
修改 MainActivity 文件
确保 MainActivity 继承自 FlutterActivity 并且不包含任何旧的 V1 注册代码。
- 定位文件: 打开
android/app/src/main/kotlin/com/your/package/name/MainActivity.kt(如果用的是 Kotlin,[推荐]) 或者android/app/src/main/java/com/your/package/name/MainActivity.java(如果用的是 Java)。 - 修改代码: 将文件内容替换为标准的 V2 embedding 代码。
- 如果你使用 Kotlin (推荐):
注意: 里面是空的!不需要任何 onCreate 或 registerWith 之类的代码。package com.your.package.name // 替换成你的包名 import io.flutter.embedding.android.FlutterActivity class MainActivity: FlutterActivity() { } - 如果你使用 Java:
注意: 同样,类体是空的。package com.your.package.name; // 替换成你的包名 import io.flutter.embedding.android.FlutterActivity; public class MainActivity extends FlutterActivity { }
修改 AndroidManifest.xml 文件
确保 AndroidManifest.xml 正确地配置 V2 embedding 的 FlutterActivity。
- 定位文件: 打开
android/app/src/main/AndroidManifest.xm。 - 检查并修改
<activity>标签: 找到android:name=".MainActivity"的那个<activity>标签。确保它的内容如下所示。特别注意android:name和<meta-data>标签。
关键修改点:<application ...> <activity android:name="io.flutter.embedding.android.FlutterActivity" android:exported="true" android:launchMode="singleTop" android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize"> <!-- Specifies an Android theme to apply to this Activity as soon as the Android process has started. This theme is visible to the user while the Flutter UI initializes. After that, this theme continues to determine the Window background behind the Flutter UI. --> <meta-data android:name="io.flutter.embedding.android.NormalTheme" android:resource="@style/NormalTheme" /> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <!-- 不要忘记我们在上一步添加的 FileProvider --> <provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.provider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"/> </provider> <!-- 其他 meta-data... --> <meta-data android:name="flutterEmbedding" android:value="2" /> </application>android:name必须是io.flutter.embedding.android.FlutterActivity。.MainActivit文件实际上不再被直接引用,Flutter V2 会自动处理;- 必须包含
meta-data标签,尤其是android:name="flutterEmbedding" android:value="2",它明确告诉构建系统使用 V2 embedding。
清理并重新构建
在修改了原生代码和配置后,必须进行一次彻底的清理。
- 在项目根目录打开终端。
- 运行
flutter clean; - 运行
flutter pub get; - 最后,重新运行你的应用:
flutter run。
这次构建会花费更长的时间,因为它会从头开始编译所有的原生代码。
更多推荐

所有评论(0)