开发者问题收集

TypeError:null 不是对象(评估“RNRandomBytes.seed”)React Native

2021-04-09
4380

我正在使用 React native 开发移动应用程序,其中涉及与 web3.js 的交互 问题是 RN 不支持核心 Node.js 模块,所以我不得不安装

npm i --save react-native-crypto

npm i --save react-native-randombytes

react-native link react-native-randombytes

npm i --save-dev rn-nodeify@latest

./node_modules/.bin/rn-nodeify --hack --install

现在每当我尝试使用 crypto 或 web3.js 时都会遇到此错误 在此处输入图片描述

有任何线索可以知道问题是什么或者如何解决吗?

2个回答

这似乎是 react-native-randombytes 库的安装问题。

你没有想过使用提供相同 API 的其他更受欢迎的库吗?

npm 表示 react-native-randombytes 每周下载量为 19,294 次。 另一个名为 react-native-get-random-values 的库(每周下载量约为 481,572 次)几乎可以保证正常工作(因为建议与 uuid 等软件包结合使用)。该库的 npm 链接为 此处

通过查看上面提到的两个库的源代码,它们都使用相同的 Android API,由 SecureRandom 支持,因此我预计 iOS 上也有相似之处。

react-native-get-random-values(链接为 此处 ):

@ReactMethod(isBlockingSynchronousMethod = true)
  public String getRandomBase64(int byteLength) throws NoSuchAlgorithmException {
    byte[] data = new byte[byteLength];
    SecureRandom random = new SecureRandom();

    random.nextBytes(data);

    return Base64.encodeToString(data, Base64.NO_WRAP);
  }

react-native-randombytes 库 - 链接 此处 :

@ReactMethod
  public void randomBytes(int size, Callback success) {
    success.invoke(null, getRandomBytes(size));
  }

private String getRandomBytes(int size) {
    SecureRandom sr = new SecureRandom();
    byte[] output = new byte[size];
    sr.nextBytes(output);
    return Base64.encodeToString(output, Base64.NO_WRAP);
  }


Stefan Majiros
2021-04-09

使用软件包

安装 @kitzen/react-native-bip39 并按照设置说明进行操作

手动设置

  1. 如果您使用 expo,请将其删除

  2. 停止 Metro 服务器。

  3. 我不知道为什么,但是 gradle 不会安装本机模块,除非它在 ​​package.json 中明确定义 ,因此请将其添加到依赖项部分:

"react-native-crypto": "*",
    "react-native-randombytes": "*",
  1. 使用 android-native 设置。切换到项目根目录中的 android 目录并运行:
./gradlew build

是的,如果您尚未安装 AndroidStudio 和 Android SDK,则需要安装它们。

Gradle 是一个模块构建器,它应该列出所有本机模块,包括 react-native-randombytes ,如下所示:

> Task :react-native-randombytes:generateDebugBuildConfig UP-TO-DATE
> Task :react-native-randombytes:javaPreCompileDebug UP-TO-DATE
> Task :react-native-randombytes:compileDebugJavaWithJavac UP-TO-DATE
> Task :react-native-randombytes:bundleLibCompileToJarDebug UP-TO-DATE
  1. 启动 Metro 服务器并按 a 部署 Android APK。如果您不重新部署应用程序,则会上传 javascript 文件,但不会上传本机模块
deathangel908
2023-07-26