Как импортировать модуль Create в Expo или React-native? - PullRequest
1 голос
/ 01 апреля 2019

После выполнения 'expo init' я ввел 'expo eject' и разделил его.

Я создал базовый файл 'jar' для тестирования приложения в App.js с использованием файла 'jar'.

enter image description here

Реализация проста.

CreateAJarFile.class в jar:

class CreateAJarFile {
    public static void main(String args[]) {
        System.out.println("We got test");
    }
}

bild.gradle (приложение):

dependencies {
  implementation fileTree(dir: 'libs', include: ['*.jar'])
  implementation files('libs/myJarFile.jar')

После применения Android я создал модуль для написания модулей в 'Apps.js'.

android / app / src / main / java / com / myjarfile

enter image description here

CreateAJarFile.java:

package com.myjarfile;

import android.widget.Toast;

import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;

import java.util.Map;
import java.util.HashMap;

public class CreateAJarFile extends ReactContextBaseJavaModule {

  private static final String DURATION_SHORT_KEY = "SHORT";
  private static final String DURATION_LONG_KEY = "LONG";

  public CreateAJarFile(ReactApplicationContext reactContext) {
    super(reactContext);
  }

  @Override
  public String getName() {
    return "CreateAJar";
  }

  @Override
  public Map<String, Object> getConstants() {
    final Map<String, Object> constants = new HashMap<>();
    constants.put(DURATION_SHORT_KEY, Toast.LENGTH_SHORT);
    constants.put(DURATION_LONG_KEY, Toast.LENGTH_LONG);
    return constants;
  }

  @ReactMethod
  public void show() {
    System.out.println("We got test");
  }

}

CreateAJarFilePackage.java:

package com.myjarfile;

import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CreateAJarFilePackage implements ReactPackage {

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

    @Override
    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
        List<NativeModule> modules = new ArrayList<>();

        modules.add(new CreateAJarFile(reactContext));

        return modules;
    }

}

CreateAJar.js:

import { NativeModules } from "react-native";

const { CreateAJar } = NativeModules;

export default CreateAJar;

android / app / src / main / java / host / exp / exponent / MainApplication.java

import com.myjarfile.CreateAJarFilePackage;
...
public List<ReactPackage> getPackages() {
    return Arrays.<ReactPackage>asList(
        // Add your own packages here!
        // TODO: add native modules!

        // Needed for `react-native link`
        // new MainReactPackage()
        new CreateAJarFilePackage());
  }

Я сделал такой модуль, добавил его и протестировал в приложении.js.

import CreateAJar from "./android/app/src/main/java/com/myjarfile/CreateAJar";

export default class App extends React.Component {
...
this.jarfunc = this.jarfunc.bind(this);
...
jarfunc() {
    CreateAJar.show();
  }
...
return (
<View style={styles.container}>
        <Text>Test</Text>
        <Text>{this.jarfunc}</Text>
      </View>

Однако и модуль, и функция не могут быть прочитаны.

Как применить созданный мной модуль к 'App.js'?

1 Ответ

0 голосов
/ 01 апреля 2019

Это была скорее проблема эмулятора, чем проблема кода.Конечно, я был настороже, потому что произошла ошибка в коде.

Любой может быть сбит с толку, потому что это часто ошибка в expo.

bundle gradle(app):

complie sdk version: 27
...
target sdk version: 26
...

Страница использования успеха

import {
  NativeModules,
...
} from "react-native";
const { CreateAJar } = NativeModules;
export default class App extends React.Component {
...
this.jarfunc = this.jarfunc.bind(this);
...
jarfunc() {
    CreateAJar.show();
  }
...
return (
<View style={styles.container}>
        <Text>Test</Text>
        <Text>{this.jarfunc}</Text>
      </View>

При этой настройке код будет работать выше anroid 8.0.

Для работы ниже android 8.0, target version долженбыть пониженным до 25.

Если метод относится к view, ошибка может возникнуть впервые, но Reload будет работать нормально.

И еще один важныйДело в том, что когда вы используете @ReactMethod, @ReactMethod работает только тогда, когда вы устанавливаете тип возвращаемого значения void.Если вы напишите int,String,number,bolean и т. Д., Это не будет работать.

Если вы хотите запустить, измените внутренний тип функции после переключения на void или задайте условие настройки @ReactMethod.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...