【问题标题】:How to Import Create Module in Expo or React-native?如何在 Expo 或 React-native 中导入创建模块?
【发布时间】:2019-08-22 05:50:43
【问题描述】:

在做'expo init'之后,我输入'expoject'并分离它。

我制作了一个基本的“jar”文件来使用“jar”文件测试 App.js 的应用程序。

实现很简单。

在 jar 中创建 AJarFile.class:

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

bild.gradle(app):

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

应用Android后,我做了一个模块,在'Apps.js'上写模块。

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

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());
  }

我做了一个这样的模块,添加它,并在 App.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”?

【问题讨论】:

    标签: android react-native jar module expo


    【解决方案1】:

    这更像是一个模拟器问题而不是代码问题。当然,我很警惕,因为代码有错误。

    任何人都可能会感到困惑,因为它通常是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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-02
      • 1970-01-01
      • 2020-01-12
      • 1970-01-01
      • 2023-01-04
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      相关资源
      最近更新 更多