React Native TurboModule初始化失败,native模块未注册?

皇甫喧丹 阅读 70

我在用TurboModule写个原生模块时,JS调用时报错说模块未找到。按照官方文档初始化了Java类并加了@ReactModule注解,但应用启动就崩溃了。错误提示是:TurboModuleRegistry.getEnforcing('MyModule') was not found

尝试过检查模块类名和导出名称是否一致,确认package路径正确。原生代码里这样注册的:


@ReactModule(name = MyModule.NAME)
public class MyModule extends TurboModule {
  public static final String NAME = "MyModule";
  // ...
}

JS端这样引入:NativeModules.MyModule.doSomething()。但就是识别不到模块,是不是需要额外配置metro?

我来解答 赞 4 收藏
二维码
手机扫码查看
1 条解答
司徒子荧
我也被这问题折腾了一整晚,后来发现光加@ReactModule注解完全不够。你得在原生工程里手动创建一个ReactPackage类,里面要返回你的模块类。举个例子:

public class MyPackage implements ReactPackage {
@Override
public List> createJSModules() {
return Collections.emptyList();
}

@Override
public @NonNull List createViewManagers(@NonNull ReactApplicationContext reactContext) {
return Collections.emptyList();
}

@Override
public @NonNull List createNativeModules(@NonNull ReactApplicationContext reactContext) {
List modules = new ArrayList<>();
modules.add(new MyModule(reactContext));
return modules;
}
}

然后在MainApplication.java里注册这个package,注意不是addPackage而是靠getPackages()方法返回的列表。如果你用的是expo那种封装过的结构,可能得通过ExpoModulesProvider去注册。metro配置一般不需要动,但记得在babel里加上react-native-turbo的插件。

最后别忘了原生模块的构造函数要带ReactApplicationContext参数,我刚开始就写了个无参构造函数,导致初始化失败还报错信息完全对不上。
点赞 8
2026-02-07 08:02