TypeError:null 不是对象(评估“RNRandomBytes.seed”)React Native
我正在使用 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
时都会遇到此错误
有任何线索可以知道问题是什么或者如何解决吗?
这似乎是 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);
}
使用软件包
安装 @kitzen/react-native-bip39 并按照设置说明进行操作
手动设置
-
如果您使用 expo,请将其删除
-
停止 Metro 服务器。
-
我不知道为什么,但是 gradle 不会安装本机模块,除非它在 ​​package.json 中明确定义 ,因此请将其添加到依赖项部分:
"react-native-crypto": "*",
"react-native-randombytes": "*",
-
使用 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
-
启动 Metro 服务器并按
a
部署 Android APK。如果您不重新部署应用程序,则会上传 javascript 文件,但不会上传本机模块