React Native TurboModule初始化失败,native模块未注册?
我在用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?
@ReactModule注解,但TurboModule应该是用@TurboModule注解,并且需要继承TurboModule接口。不过,看你的描述,可能还需要确保你已经正确地在CatalystInstanceImpl中注册了这个模块,或者使用了TurboModule的自动注册机制。检查一下你的
react-native.config.js文件,确保你的模块被正确地列出来,这样Metro才能知道需要打包你的原生模块。通常看起来像这样:其次,确认一下你的原生模块在Android的MainApplication.java中被正确地注册了。你需要确保
getPackages()方法返回的列表包含了你的TurboModule。如果是自动注册,确保你的模块类名符合自动注册的命名规则。最后,确保你的Metro配置支持TurboModule。你可能需要在
metro.config.js中添加一些配置,比如:不过,这段代码假设你使用的是Expo,如果你不是,可能需要根据实际情况调整。
希望这些信息能帮助你解决这个问题。这样更清晰
public class MyPackage implements ReactPackage {
@Override
public List
return Collections.emptyList();
}
@Override
public @NonNull List
return Collections.emptyList();
}
@Override
public @NonNull List
List
modules.add(new MyModule(reactContext));
return modules;
}
}
然后在MainApplication.java里注册这个package,注意不是addPackage而是靠getPackages()方法返回的列表。如果你用的是expo那种封装过的结构,可能得通过ExpoModulesProvider去注册。metro配置一般不需要动,但记得在babel里加上react-native-turbo的插件。
最后别忘了原生模块的构造函数要带ReactApplicationContext参数,我刚开始就写了个无参构造函数,导致初始化失败还报错信息完全对不上。