Android 弹出的Expo应用程序在NativeModules中找不到自定义本机模块

Android 弹出的Expo应用程序在NativeModules中找不到自定义本机模块,android,react-native,expo,Android,React Native,Expo,我有一个React原生应用程序,它是使用Expo构建的,然后我将其弹出到ExpoKit 我想尝试实现一个定制的原生Android模块,但由于弹出的ExpoKit应用程序的布局有所改变。因此,android目录的布局如下: ///android/app/src/main/java/com/reactlibrary/ToastModule.java 包com.com库; 导入android.widget.Toast; 导入com.facebook.react.bridge.NativeModule

我有一个React原生应用程序,它是使用Expo构建的,然后我将其弹出到ExpoKit

我想尝试实现一个定制的原生Android模块,但由于弹出的ExpoKit应用程序的布局有所改变。因此,
android
目录的布局如下:

///android/app/src/main/java/com/reactlibrary/ToastModule.java
包com.com库;
导入android.widget.Toast;
导入com.facebook.react.bridge.NativeModule;
导入com.facebook.react.bridge.ReactApplicationContext;
导入com.facebook.react.bridge.ReactContext;
导入com.facebook.react.bridge.ReactContextBaseJavaModule;
导入com.facebook.react.bridge.ReactMethod;
导入java.util.Map;
导入java.util.HashMap;
公共类ToastModule扩展了ReactContextBaseJavaModule{
私有静态最终字符串持续时间\u SHORT\u KEY=“SHORT”;
私有静态最终字符串持续时间\u LONG\u KEY=“LONG”;
公共演讲模块(ReactApplicationContext reactContext){
超级(反应上下文);
}
@凌驾
公共字符串getName(){
返回“ToastExample”;
}
@凌驾
公共映射getConstants(){
final Map常量=new HashMap();
常量.put(持续时间\u短\u键,Toast.LENGTH\u短);
常量.put(DURATION\u LONG\u KEY,Toast.LENGTH\u LONG);
返回常数;
}
@反应法
公共无效显示(字符串消息,整数持续时间){
Toast.makeText(getReactApplicationContext(),message,duration).show();
}
}
///android/app/src/main/java/com/reactlibrary/ToastPackage.java
包com.com库;
导入com.facebook.react.ReactPackage;
导入com.facebook.react.bridge.NativeModule;
导入com.facebook.react.bridge.ReactApplicationContext;
导入com.facebook.react.uimanager.ViewManager;
导入java.util.ArrayList;
导入java.util.Collections;
导入java.util.List;
公共类CustomToAspackage实现了ReactPackage{
@凌驾
公共列表CreateViewManager(ReactApplicationContext reactContext){
返回集合。emptyList();
}
@凌驾
公共列表createNativeModules(ReactApplicationContext reactContext){
列表模块=新的ArrayList();
添加(新的toastmule(reactContext));
返回模块;
}
}
///android/app/src/main/java/host/exp/exponent/MainApplication.java
包host.exp.index;
//其他进口
导入com.reactlibrary.CustomToAspackage
公共类MainApplication扩展ExpoApplication实现AppLoaderPackagesProviderInterface{
//需要“反应”本机链接`
公共列表getPackages(){
返回数组.asList(
//需要“反应”本机链接`
新建MainReactPackage(),
新的KCKeepAwakePackage(),
新CustomToAspackage()
);
}
//其他方法。。。
}
最后,在我的React本机应用程序中,我按如下方式加载它:

// <workspace>/src/utils/native-modules.ts

import { NativeModules } from 'react-native'

export const { ToastExample } = NativeModules
///src/utils/native-modules.ts
从“react native”导入{NativeModules}
导出常量{ToastExample}=NativeModules
预期结果 我希望
native modules.ts中的
toastemple
返回一些API,在本例中,我可以与
customtoaspackage
公开的方法进行交互

实际结果
ToastExample
未定义。

请在同一路径上声明模块

///android/app/src/main/java/com/reactlibrary/index.js
从“react native”导入{NativeModules};
const{ToastExample}=NativeModules;
将默认值导出到示例;
用法

导入{
本机模块
}从“反应本族语”;
...
const{ToastExample}=NativeModules;
...
ToastExample.show('Awesome',ToastExample.SHORT);

从您的代码判断,您自定义的包创建看起来是正确的。假设android代码也是在运行应用程序之前构建的(而不仅仅是从bundler重新加载软件包),我希望它能起作用

您没有在ToastExample上显示实际的方法请求,那么您在什么时候确定ToastExample是未定义的?你使用调试器了吗

import { NativeModules } from 'react-native';
const { ToastExample } = NativeModules;

showTest = () => {
  ToastExample.show('test', ToastExample.SHORT);
}

如果在showTest函数中设置断点,则在调试控制台中计算“ToastExample”时,调试器可能会返回ReferenceError,而代码运行正常。那么,代码在运行时真的中断了吗?

您是从哪里想到把它放在与Java类相同的目录中的?不管怎么说,我试过了,但没用。这实际上是我使用它的方式,我参考了官方文件。文档实际上没有告诉您将任何javascript文件放在与Java类相同的目录中。这意味着它与项目的其余部分位于同一目录中。在您的项目中,如果仍在应用程序中导入
NativeModules
,您可能可以删除
reactlibrary
中的
index.js
文件