如何在 Android 应用程序的 React Native 中设置 canOverrideExistingModule=true?
How to set canOverrideExistingModule=true in React Native for Android Apps?
我使用 React Native 构建了一个 android 应用程序,它构建成功但是当我 运行 我的 Android 虚拟设备中的应用程序时,它显示了一个完整的红色屏幕以下错误:
我以前没有做过本机应用程序开发,我也不了解 Java 所以我不知道这个错误是什么意思以及如何解决这个问题。
您可以尝试检查目录中的文件 MainApplication.java
:android\app\src\main\java
是否存在任何重复的包 AirMapModule,如果有则删除 1 个。
与此错误关联的包名称不是 AirMapModule
,而是来自 com.airbnb.android.react.maps
的 MapsPackage
。
在您的 MainApplication.java
目录中:android/app/src/main/java/../../
删除任何重复条目:
- 导入包:
import com.airbnb.android.react.maps.MapsPackage
- 对模块构造函数的调用:
new MapsPackage()
在函数 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;
}
一切都变得正确了。
转到 MainAplication 文件。
删除重复包并在getPackages()
方法中删除重复包
@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new MainReactPackage(),
new VectorIconsPackage()
);
}
然后在您的终端中尝试此命令后:
- cd android
- ./gradlew clean
检查您的 MainApplication.java
,特别是 protected List<ReactPackage> getPackages()
; AirMapModule
可能在列表中出现两次
如果您使用的 RN 版本 >= 0.60,那么自动链接和您的手动链接可能会做同样的事情两次。您有两个选择:
1- 您可以在 getPackages
方法中还原代码更改
2- 您可以在 react-native-config.js
文件中禁用自动链接。
如果安装了库 react-navigation,您可以 运行 通过 android studio。
否则删除库 react-navigation 并且只是 yarn 它会起作用。
解决方案
转到android/app/src/main/java/YOURPACKAGE/MainApplication.java
查找方法getPackages();
删除这个packages.add(new MapsPackage());
镇痛丸! :)
转到您的模块(因为您收到此错误消息的原因)打开模块.. 将此代码添加到其中...
@Override
public boolean canOverrideExistingModule() {
return true;
}
这里只添加没有自动链接的模块,
@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;
}
如果模块是自动链接的并在此处添加模块,您将收到此错误。
上面的解决方案都是正确的,但是我稍微解释一下,上面的一些解决方案建议重写下面的方法。
@Override
public boolean canOverrideExistingModule() {
return true;
}
但是问题是在哪里覆盖?首先,您不能在 MainActivity.java 或 MainApplication.java 文件中覆盖。
您应该在某些 node_modules 项目文件夹中的 class 中覆盖它,并且 class 将从 ReactContextBaseJavaModule [=44] 扩展=].
在我的例子中,它没有在 imports/adding 个重复的包中重复出现,但这主要是因为自动链接导致重复出现。
我正在使用 react-native-contacts npm 包进行交互,所以我所做的就是进入
node_modules\react-native-contacts\android\src\main\java\comrt2zz\reactnativecontacts\
ContactsManager.java
而这个 ContactsManager 是从 ReactContextBaseJavaModule 扩展而来的,我重写了那里并解决了问题。
所以一般来说,可能会有 lot 的 classes 将从 ReactContextBaseJavaModule 扩展到不同的项目中node_modules,但你需要找到一个会产生重复问题的特定项目,在那里你应该覆盖它。
只需删除 packages.add(new MapsPackage());
这一行 MainApplication.java
您可以从
MainApplication.java
我使用 React Native 构建了一个 android 应用程序,它构建成功但是当我 运行 我的 Android 虚拟设备中的应用程序时,它显示了一个完整的红色屏幕以下错误:
我以前没有做过本机应用程序开发,我也不了解 Java 所以我不知道这个错误是什么意思以及如何解决这个问题。
您可以尝试检查目录中的文件 MainApplication.java
:android\app\src\main\java
是否存在任何重复的包 AirMapModule,如果有则删除 1 个。
与此错误关联的包名称不是 AirMapModule
,而是来自 com.airbnb.android.react.maps
的 MapsPackage
。
在您的 MainApplication.java
目录中:android/app/src/main/java/../../
删除任何重复条目:
- 导入包:
import com.airbnb.android.react.maps.MapsPackage
- 对模块构造函数的调用:
new MapsPackage()
在函数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;
}
一切都变得正确了。
转到 MainAplication 文件。
删除重复包并在getPackages()
方法中删除重复包
@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new MainReactPackage(),
new VectorIconsPackage()
);
}
然后在您的终端中尝试此命令后:
- cd android
- ./gradlew clean
检查您的 MainApplication.java
,特别是 protected List<ReactPackage> getPackages()
; AirMapModule
可能在列表中出现两次
如果您使用的 RN 版本 >= 0.60,那么自动链接和您的手动链接可能会做同样的事情两次。您有两个选择:
1- 您可以在 getPackages
方法中还原代码更改
2- 您可以在 react-native-config.js
文件中禁用自动链接。
如果安装了库 react-navigation,您可以 运行 通过 android studio。 否则删除库 react-navigation 并且只是 yarn 它会起作用。
解决方案
转到android/app/src/main/java/YOURPACKAGE/MainApplication.java
查找方法getPackages();
删除这个packages.add(new MapsPackage());
镇痛丸! :)
转到您的模块(因为您收到此错误消息的原因)打开模块.. 将此代码添加到其中...
@Override
public boolean canOverrideExistingModule() {
return true;
}
这里只添加没有自动链接的模块,
@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;
}
如果模块是自动链接的并在此处添加模块,您将收到此错误。
上面的解决方案都是正确的,但是我稍微解释一下,上面的一些解决方案建议重写下面的方法。
@Override
public boolean canOverrideExistingModule() {
return true;
}
但是问题是在哪里覆盖?首先,您不能在 MainActivity.java 或 MainApplication.java 文件中覆盖。
您应该在某些 node_modules 项目文件夹中的 class 中覆盖它,并且 class 将从 ReactContextBaseJavaModule [=44] 扩展=].
在我的例子中,它没有在 imports/adding 个重复的包中重复出现,但这主要是因为自动链接导致重复出现。
我正在使用 react-native-contacts npm 包进行交互,所以我所做的就是进入
node_modules\react-native-contacts\android\src\main\java\comrt2zz\reactnativecontacts\
ContactsManager.java
而这个 ContactsManager 是从 ReactContextBaseJavaModule 扩展而来的,我重写了那里并解决了问题。
所以一般来说,可能会有 lot 的 classes 将从 ReactContextBaseJavaModule 扩展到不同的项目中node_modules,但你需要找到一个会产生重复问题的特定项目,在那里你应该覆盖它。
只需删除 packages.add(new MapsPackage());
这一行 MainApplication.java
您可以从 MainApplication.java