React-native app: как исправить AppRegistry не является зарегистрированным модулем (вызывая runApplication) - PullRequest
0 голосов
/ 12 мая 2019

Я новичок в разработке 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) (см. Связанное изображение)

React native error

Я использую собственную версию реагирования 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, но все они, похоже, связаны с разными вещами, как будто эта ошибка была очень общей, скрывающей реальную проблему.

Любая помощь будет принята с благодарностью.

...