【发布时间】:2017-06-10 07:55:13
【问题描述】:
我使用 React Native 构建了一个 android 应用程序,它构建成功,但是当我在我的 Android 虚拟设备中运行该应用程序时,它显示一个完整的红色屏幕并显示以下错误:
我以前没有做过原生应用程序开发,我也没有任何 Java 知识,所以我不知道这个错误意味着什么以及如何解决这个问题。
【问题讨论】:
标签: java android react-native avd
我使用 React Native 构建了一个 android 应用程序,它构建成功,但是当我在我的 Android 虚拟设备中运行该应用程序时,它显示一个完整的红色屏幕并显示以下错误:
我以前没有做过原生应用程序开发,我也没有任何 Java 知识,所以我不知道这个错误意味着什么以及如何解决这个问题。
【问题讨论】:
标签: java android react-native avd
与此错误关联的包的名称不是AirMapModule,而是来自com.airbnb.android.react.maps 的MapsPackage。
在您的MainApplication.java 目录中:android/app/src/main/java/../../ 删除任何重复的条目:
import com.airbnb.android.react.maps.MapsPackage
new MapsPackage() in function getPackages
【讨论】:
转到文件“MainApplication.java”(.\android\app\src\main\java\com\projectName\ 下)
确保在getPackages() 函数下没有重复的行(在我的例子中,我有两次“new MapsPackage()”)。
同时修复重复导入。
【讨论】:
通过该地址打开MainApplication.java文件:android/app/src/main/java/com/projectName/MainApplication.java并将以下代码添加到MainApplication.java文件中:
@Override
public boolean canOverrideExistingModule() {
return true;
}
一切都变得正确。
【讨论】:
ReactContextBaseJavaModule的本机模块类中
转到 MainAplication 文件。
删除重复包并在getPackages()方法中删除重复包
@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new MainReactPackage(),
new VectorIconsPackage()
);
}
然后在您的终端中尝试此命令后:
【讨论】:
如果您使用的 RN 版本 >= 0.60,那么自动链接和手动链接可能会执行两次相同的操作。你有两个选择:
1- 您可以在 getPackages 方法中恢复代码更改
2- 您可以在react-native-config.js 文件中禁用自动链接。
【讨论】:
上面的解决方案都是正确的,但是让我稍微解释一下,上面的一些解决方案建议覆盖下面的方法。
@Override
public boolean canOverrideExistingModule() {
return true;
}
但是问题是在哪里覆盖?首先,您不能在 MainActivity.java 或 MainApplication.java 文件中覆盖。
您应该在某个 node_modules 项目文件夹内的类中覆盖它,并且该类将从 ReactContextBaseJavaModule 类扩展。
在我的情况下,它没有在导入/添加重复包中重复,但这主要是因为自动链接,这使它重复。
我正在使用 react-native-contacts npm 包进行交互,所以我所做的就是进入内部
node_modules\react-native-contacts\android\src\main\java\comrt2zz\reactnativecontacts\
ContactsManager.java
并且这个 ContactsManager 是从 ReactContextBaseJavaModule 扩展而来的,我在那里覆盖并解决了问题。
因此,一般而言,可能有 很多 类将从 ReactContextBaseJavaModule 扩展至 node_modules 内的不同项目下,但您需要选择特定的项目正在创建重复问题,您应该在那里覆盖它。
【讨论】:
转到您的模块(因为您收到此错误消息)打开模块..将此代码添加到其中...
@Override
public boolean canOverrideExistingModule() {
return true;
}
【讨论】:
您可以尝试检查目录MainApplication.java中的文件android\app\src\main\java是否存在重复包AirMapModule,如果有则删除1。
【讨论】:
MainActivity.java?
解决方案
转到android/app/src/main/java/YOURPACKAGE/MainApplication.java
查找方法getPackages();
删除这个packages.add(new MapsPackage());
镇静丸! :)
【讨论】:
检查您的MainApplication.java,尤其是protected List<ReactPackage> getPackages(); AirMapModule 可能在列表中出现两次
【讨论】:
仅在此处添加未自动链接的模块,
@Override
protected List<ReactPackage> getPackages() {
@SuppressWarnings("UnnecessaryLocalVariable")
List<ReactPackage> packages = new PackageList(this).getPackages();
// Packages that cannot be autolinked yet can be added manually here, for
// example: packages.add(new MyReactNativePackage());
return packages;
}
如果模块是自动链接并在此处添加模块,您将收到此错误。
【讨论】:
只需删除 packages.add(new MapsPackage()); 这一行 MainApplication.java
【讨论】:
您可以从 MainApplication.java
【讨论】:
如果安装了库 react-navigation,您可以通过 android studio 运行。 否则删除库 react-navigation ,只需使用 yarn 即可。
【讨论】: