React 本机自动链接不起作用 (RN0.61.5)

React native auto linking is not working (RN0.61.5)

最近我使用 react-native upgrade 命令从 react-native 0.59.1 升级到 0.61.5。以前我对某些包使用手动链接,我使用 react-native unlink 删除了它,但现在当我 运行 在 android 它构建时它无法正常工作,但该应用程序仅显示以下内容错误

我真的是 react-native 的新手,所以我不知道要分享什么。因此,如果您需要更多信息,请询问。

MainApplication.java

import android.app.Application;

import com.facebook.react.ReactApplication;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.react.shell.MainReactPackage;
import com.facebook.soloader.SoLoader;

import java.util.Arrays;
import java.util.List;

public class MainApplication extends Application implements ReactApplication {

  private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
    @Override
    public boolean getUseDeveloperSupport() {
      return BuildConfig.DEBUG;
    }

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

    @Override
    protected String getJSMainModuleName() {
      return "index";
    }
  };

  @Override
  public ReactNativeHost getReactNativeHost() {
    return mReactNativeHost;
  }

  @Override
  public void onCreate() {
    super.onCreate();
    SoLoader.init(this, /* native exopackage */ false);
  }
}

为确保您拥有版本 0.61.5 的更新,请查看此 React-Native 更新帮助 link https://react-native-community.github.io/upgrade-helper/.

之后 运行 npm 安装,尝试转到 Android 文件夹和 运行 ./gradlew clean 用于 powershell 或 gradlew clean 用于 cmd。

我认为这个包 (react-native-device-info) 与 v0.6 不兼容,例如我无法在没有手动链接的情况下迁移 react-native-bluetooth-status。 但是我检查了 react-native-device-info 并且它已经在 16 天前更新了,所以我想如果你升级你的包它会自动链接。

某些版本的 ReactNative 中的自动链接存在一些问题。您所有的包都链接在您的 MainApplication.java 文件中。在您的文件中,可以清楚地看到包列表中缺少 RNDeviceInfo,我怀疑这也可能导致其他第三方模块出现问题。我这里只是提一下如何处理RNDeviceInfo模块。 将您的源代码更新为:


import android.app.Application;

import com.facebook.react.ReactApplication;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.react.shell.MainReactPackage;
import com.facebook.soloader.SoLoader;

import java.util.Arrays;
import java.util.List;

import com.learnium.RNDeviceInfo.RNDeviceInfo; //Add this import

public class MainApplication extends Application implements ReactApplication {

  private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
    @Override
    public boolean getUseDeveloperSupport() {
      return BuildConfig.DEBUG;
    }

    @Override
    protected List<ReactPackage> getPackages() {
      return Arrays.<ReactPackage>asList(
          new MainReactPackage(),
          new RNDeviceInfo() //add this dependency in the list
      );
    }

    @Override
    protected String getJSMainModuleName() {
      return "index";
    }
  };

  @Override
  public ReactNativeHost getReactNativeHost() {
    return mReactNativeHost;
  }

  @Override
  public void onCreate() {
    super.onCreate();
    SoLoader.init(this, /* native exopackage */ false);
  }
}

解决此问题后,其他模块可能会出现同样的问题。要解决,只需访问他们的 github 存储库并完成 android 平台的手动链接过程。 希望这有帮助。

我最近偶然发现了同样的问题 -> 当你查看一个新初始化的项目时,你会看到 getPackages() 是依赖 PackageList(this).getPackages(); 而不是 new MainReactPackage() 实现的您的依赖项列表。

  private final ReactNativeHost mReactNativeHost =
  new ReactNativeHost(this) {
    @Override
    public boolean getUseDeveloperSupport() {
      return BuildConfig.DEBUG;
    }

    @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
    protected String getJSMainModuleName() {
      return "index";
    }
  };