【问题标题】:How to set canOverrideExistingModule=true in React Native for Android Apps?如何在 React Native for Android 应用程序中设置 canOverrideExistingModule=true?
【发布时间】:2017-06-10 07:55:13
【问题描述】:

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

我以前没有做过原生应用程序开发,我也没有任何 Java 知识,所以我不知道这个错误意味着什么以及如何解决这个问题。

【问题讨论】:

    标签: java android react-native avd


    【解决方案1】:

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

    在您的MainApplication.java 目录中:android/app/src/main/java/../../ 删除任何重复的条目:

    • 导入包:import com.airbnb.android.react.maps.MapsPackage
    • 对模块构造函数的调用:new MapsPackage() in function getPackages

    【讨论】:

    • 网上到处都提到了第一个项目符号,但这是第一次提到第二个地方寻找重复项。谢谢。
    • 当您尝试在 MainApplication.java 文件中两次导入相同的包时会出现此错误
    • 这可行,但每次我链接一个库时它都会重复自己
    • 只需从 MainApplication.java 中删除重复的导入
    • 如果你来到这里,这个答案肯定是你要找的答案
    【解决方案2】:

    转到文件“MainApplication.java”(.\android\app\src\main\java\com\projectName\ 下)

    确保在getPackages() 函数下没有重复的行(在我的例子中,我有两次“new MapsPackage()”)。

    同时修复重复导入。

    【讨论】:

      【解决方案3】:

      通过该地址打开MainApplication.java文件:android/app/src/main/java/com/projectName/MainApplication.java并将以下代码添加到MainApplication.java文件中:

      @Override    
      public boolean canOverrideExistingModule() {        
        return true;    
      }   
      

      一切都变得正确。

      【讨论】:

      • 原生模块到底是什么意思?图书馆?我收到一个错误“模块没有覆盖它的超类中的方法”
      • 有人可以更具体地了解一下这个解决方案吗?请告诉我们什么和在哪里...
      • 感谢@Andew Fan 实际回答问题
      • @ThembelaniM 您可以将覆盖函数添加到扩展ReactContextBaseJavaModule的本机模块类中
      • 究竟应该在哪里添加这个 sn-p?
      【解决方案4】:

      转到 MainAplication 文件

      删除重复包并在getPackages()方法中删除重复包

        @Override
          protected List<ReactPackage> getPackages() {
            return Arrays.<ReactPackage>asList(
                new MainReactPackage(),
                  new VectorIconsPackage()
            );
          }
      

      然后在您的终端中尝试此命令后:

      • cd 安卓
      • ./gradlew clean

      【讨论】:

        【解决方案5】:

        如果您使用的 RN 版本 >= 0.60,那么自动链接和手动链接可能会执行两次相同的操作。你有两个选择:

        1- 您可以在 getPackages 方法中恢复代码更改
        2- 您可以在react-native-config.js 文件中禁用自动链接。

        【讨论】:

        • 我做的和你提到的完全一样:)。谢谢朋友。
        • 在 v0.61.5 中,这就是我的答案。毫无戒心
        【解决方案6】:

        上面的解决方案都是正确的,但是让我稍微解释一下,上面的一些解决方案建议覆盖下面的方法。

        @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 内的不同项目下,但您需要选择特定的项目正在创建重复问题,您应该在那里覆盖它。

        【讨论】:

          【解决方案7】:

          转到您的模块(因为您收到此错误消息)打开模块..将此代码添加到其中...

          @Override    
          public boolean canOverrideExistingModule() {        
            return true;    
          }   
          

          【讨论】:

          【解决方案8】:

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

          【讨论】:

          • MailApplication.java 文件中既没有包,也没有名为 AirMapModule 的变量 :(
          • 你使用什么版本的 react-native ?
          • react-native-cli: 2.0.1 react-native: 0.36.0
          • 您是否也尝试检查同一目录中的文件MainActivity.java
          • 是的,我刚刚做到了。即使这样也没有任何与 AirMapModule 相关的东西。 :(
          【解决方案9】:

          解决方案

          转到android/app/src/main/java/YOURPACKAGE/MainApplication.java

          查找方法getPackages();

          删除这个packages.add(new MapsPackage());

          镇静丸! :)

          【讨论】:

          • 这不是答案人((
          【解决方案10】:

          检查您的MainApplication.java,尤其是protected List&lt;ReactPackage&gt; getPackages()AirMapModule 可能在列表中出现两次

          【讨论】:

            【解决方案11】:

            仅在此处添加未自动链接的模块,

                    @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;
                    }
            
            

            如果模块是自动链接并在此处添加模块,您将收到此错误。

            【讨论】:

              【解决方案12】:

              只需删除 packages.add(new MapsPackage()); 这一行 MainApplication.java

              【讨论】:

                【解决方案13】:

                您可以从 MainApplication.java

                enter image description here

                【讨论】:

                【解决方案14】:

                如果安装了库 react-navigation,您可以通过 android studio 运行。 否则删除库 react-navigation ,只需使用 yarn 即可。

                【讨论】:

                  猜你喜欢
                  • 2018-09-14
                  • 1970-01-01
                  • 2017-05-10
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-05-17
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-04-14
                  相关资源
                  最近更新 更多