FlutterActivity 访问 Dart VM 服务的有效方法
2024-03-06 18:27:57
在 Android Studio 直接运行 FlutterActivity 时访问 Dart VM 服务
问题:无法连接到 Dart VM 服务
在 Android Studio 中直接运行 FlutterActivity 时,你可能会遇到无法使用 Dart VM Service 的问题。这可能会令人沮丧,因为 Dart VM Service 是调试和检查 Flutter 应用程序的宝贵工具。
原因:ActivityThread.currentActivityThread() 返回 null
这个问题的根源在于 Android Studio 的调试配置。当直接启动 FlutterActivity 时,它使用 ActivityThread.currentActivityThread() 方法检索当前正在运行的 Activity。然而,对于 FlutterActivity,此方法返回 null,导致 Dart VM Service 无法正确注册和侦听连接。
解决方案:使用附加代码检索当前 Activity
要解决此问题,需要使用不同的方法检索当前 Activity。以下步骤将指导你解决此问题:
1. 添加附加代码:
在 MainActivity 中添加以下代码:
import android.app.Activity;
public class MainActivity extends FlutterActivity {
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(newBase);
Activity currentActivity = ActivityThread.currentActivityThread().getApplication().getPackageManager().getLaunchIntentForPackage(newBase.getPackageName()).resolveActivityInfo(newBase.getPackageManager(), 0).activityInfo.name;
FlutterInjector.instance().addLookupKeyFor(Activity.class, currentActivity);
}
// 其他代码...
}
2. 同步项目:
添加代码后,确保同步你的项目以使更改生效。
代码解析
添加的代码块通过以下步骤解决了问题:
- 检索启动 Activity:它使用 ActivityThread.currentActivityThread().getApplication().getPackageManager().getLaunchIntentForPackage(newBase.getPackageName()) 检索启动当前应用程序的 Activity。
- 获取 ActivityInfo:然后,它使用 resolveActivityInfo() 方法获取启动 Activity 的 ActivityInfo。
- 设置查找键:最后,它使用 FlutterInjector.instance().addLookupKeyFor(Activity.class, currentActivity) 将检索到的 Activity 名称设置为主键。
此代码块允许 Dart VM 服务正确注册并侦听来自 FlutterActivity 的连接。
结论
通过使用上述方法,你可以在 Android Studio 中直接运行 FlutterActivity 时访问 Dart VM 服务。这使你能够有效地调试和检查你的应用程序,从而提高开发效率。
常见问题解答
1. 为什么直接运行 FlutterActivity 时会出现这个问题?
这是由于 Android Studio 的调试配置在检索当前 Activity 时出现问题。
2. 添加的代码块是如何解决这个问题的?
它检索启动 Activity 的名称并将其设置为查找键,允许 Dart VM 服务正确注册和侦听。
3. 除了使用提供的代码块之外,还有其他方法来解决这个问题吗?
截至目前,这是已知解决此问题的唯一方法。
4. 此方法是否适用于所有 Android 设备?
此方法应该适用于所有 Android 设备。
5. 此方法是否存在任何缺点?
此方法没有已知的缺点。