Я новичок в разработке React Native и создаю приложение, использующее собственную библиотеку Android, созданную мной, включая ее в виде файла .aar.
Я создал собственный модуль, как описано в https://facebook.github.io/react-native/docs/native-modules-android, и установил его с npm install
. После того, как я также связал собственный модуль с помощью npm link
и, наконец, сгенерировал пакет android js, используя команду
react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res
Когда я запускаю командуact-native run-android, я получаю эту ошибку:
appregistry не является зарегистрированным вызываемым модулем (вызывающим runApplication) (см. Связанное изображение)
Я использую собственную версию реагирования 0.89.8 на узле 10.15.3.
Вот родной модуль моста Java-код:
модуль класса
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.Callback;
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
// more imports...
public class RNMyBridgeModule extends ReactContextBaseJavaModule {
boolean hasReadPhoneStatePermission = false;
private static final int APP_PERMISSIONS_READ_PHONE_STATE = 196;
private final ReactApplicationContext reactContext;
public RNApbBridgeModule(ReactApplicationContext reactContext) {
super(reactContext);
this.reactContext = reactContext;
}
@Override
public String getName() {
return "RNMyBridge";
}
@ReactMethod
public void send(String appName) {
Context ctx = getReactApplicationContext();
hasReadPhoneStatePermission = //... boilerplate code for phone state permission
MyModule mm = new MyModule(getReactApplicationContext(), hasReadPhoneStatePermission);
mm.doStuff(appName, null);
}
}
класс упаковки
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;
import com.facebook.react.bridge.JavaScriptModule;
public class RNMyModulePackage implements ReactPackage {
@Override
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
return Arrays.<NativeModule>asList(new RNMyBridgeModule(reactContext));
}
public List<Class<? extends JavaScriptModule>> createJSModules() {
return Collections.emptyList();
}
@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
return Collections.emptyList();
}
}
основной класс
import android.app.Application;
import com.facebook.react.ReactApplication;
import com.mypackage.RNMyModulePackage;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.react.shell.MainReactPackage;
import com.facebook.soloader.SoLoader;
import java.util.Arrays;
import java.util.List;
public class MainApplication extends Application implements ReactApplication {
private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
@Override
public boolean getUseDeveloperSupport() {
return BuildConfig.DEBUG;
}
@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new MainReactPackage(),
new RNMyModulePackage()
);
}
@Override
protected String getJSMainModuleName() {
return "index";
}
};
@Override
public ReactNativeHost getReactNativeHost() {
return mReactNativeHost;
}
@Override
public void onCreate() {
super.onCreate();
SoLoader.init(this, /* native exopackage */ false);
}
}
класс активности
import com.facebook.react.ReactActivity;
public class MainActivity extends ReactActivity {
/**
* Returns the name of the main component registered from JavaScript.
* This is used to schedule rendering of the component.
*/
@Override
protected String getMainComponentName() {
return "MyAppName";
}
}
js индексный файл (index.js)
// this is added to npm locally with this name, using npm install and it's properly installed
import MyModule from 'rn-mymodule-bridge';
module.exports = MyModule;
index.android.js (где вызывается модуль)
import React from 'react';
import { Alert, Button, Image, StyleSheet, Text, TextInput, View } from 'react-native';
export default class MyApp extends React.Component {
_onPressButton() {
Alert.alert('You tapped the button!');
MyModule.send("MyApp");
}
render() {
return (
<View style={styles.container}>
{/* Header and top button */}
<Text style={styles.header}>My Module Calls</Text>
<View style={{margin:10}}>
<Button onPress={this._onPressButton}
type="clear"
color="orange"
title="Do something now!"
accessibilityLabel="Press this button to do something!"/>
</View>
{/* more view components... */}
{/* Close Container View */}
<Text style={styles.title}></Text>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
backgroundColor: 'rgba(220,230,218,1)',
flex:1,
},
header: {
alignItems: 'flex-start',
backgroundColor: 'green',
color: 'white',
fontSize: 24,
textAlign: 'center',
marginTop: 24,
maxHeight: 40,
flex:1,
},
title: {
alignItems: 'flex-start',
backgroundColor: 'rgba(0,0,0,1)',
color: '#fff',
fontSize: 20,
textAlign: 'center',
maxHeight: 40,
flex:1,
},
button: {
borderRadius: 5,
fontSize: 30,
margin: 50,
padding: 10,
marginLeft: 10,
marginRight: 10,
marginTop: 20,
marginBottom: 20,
textAlign: 'center',
flex:1,
},
textInput: {
padding: 10,
fontSize: 24,
}
});
AppRegistry.registerComponent('MyApp', () => MyApp);
У меня есть подозрение, что проблема связана с загрузкой и поиском моего пользовательского модуля, но я понятия не имею, что может быть за конкретная ошибка и исправление.
Я прочитал все другие связанные вопросы по SO, но все они, похоже, связаны с разными вещами, как будто эта ошибка была очень общей, скрывающей реальную проблему.
Любая помощь будет принята с благодарностью.