如何在 Android 应用程序的 React Native 中设置 canOverrideExistingModule=true?

How to set canOverrideExistingModule=true in React Native for Android Apps?

我使用 React Native 构建了一个 android 应用程序,它构建成功但是当我 运行 我的 Android 虚拟设备中的应用程序时,它显示了一个完整的红色屏幕以下错误:

我以前没有做过本机应用程序开发,我也不了解 Java 所以我不知道这个错误是什么意思以及如何解决这个问题。

您可以尝试检查目录中的文件 MainApplication.javaandroid\app\src\main\java 是否存在任何重复的包 AirMapModule,如果有则删除 1 个。

与此错误关联的包名称不是 AirMapModule,而是来自 com.airbnb.android.react.mapsMapsPackage

在您的 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