当前位置: 首页 > 知识库问答 >
问题:

弹出的Expo应用程序在NativeModules中找不到自定义本机模块

陈项禹
2023-03-14

我有一个React原生应用程序,它是使用Expo构建的,然后弹出到ExpoKit中。

我遵循本教程尝试实现一个自定义的原生Android模块,由于弹出的ExpoKit应用程序的布局而做了一些更改。因此,android目录的布局如下:

// <workspace>/android/app/src/main/java/com/reactlibrary/ToastModule.java

package com.reactlibrary;

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 ToastModule extends ReactContextBaseJavaModule {

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

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

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

    @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(String message, int duration) {
        Toast.makeText(getReactApplicationContext(), message, duration).show();
    }

}
// <workspace>/android/app/src/main/java/com/reactlibrary/ToastPackage.java

package com.reactlibrary;

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 CustomToastPackage 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 ToastModule(reactContext));

        return modules;
    }

}
// <workspace>/android/app/src/main/java/host/exp/exponent/MainApplication.java

package host.exp.exponent;

// other imports

import com.reactlibrary.CustomToastPackage

public class MainApplication extends ExpoApplication implements AppLoaderPackagesProviderInterface<ReactPackage> {

  // Needed for `react-native link`
  public List<ReactPackage> getPackages() {
    return Arrays.<ReactPackage>asList(
        // Needed for `react-native link`
        new MainReactPackage(),

        new KCKeepAwakePackage(),
        new CustomToastPackage()
    );
  }

  // other methods...
}

最后,在我的React本机应用程序中,我加载它,如下所示:

// <workspace>/src/utils/native-modules.ts

import { NativeModules } from 'react-native'

export const { ToastExample } = NativeModules

共有1个答案

齐迪
2023-03-14

请在同一路径上进行模块声明。

// <workspace>/android/app/src/main/java/com/reactlibrary/index.js
import { NativeModules } from "react-native";

const { ToastExample } = NativeModules;

export default ToastExample;

用法

import {
  NativeModules
} from "react-native";
...
const { ToastExample } = NativeModules;
...
ToastExample.show('Awesome', ToastExample.SHORT);
 类似资料:
  • 我使用expo cli制作了一个应用程序,现在我希望它弹出以作出本机反应。我使用命令“expo eject”弹出应用程序。当我给npm运行android时,应用程序没有成功构建,并且有很多错误。我试图解决这些问题,但没有一个解决办法对我有效。 react本地运行的android 运行jetifier将库迁移到AndroidX的信息。您可以使用“-no jetifier”标志禁用它。Jetifier

  • 我正在尝试使用expo客户端在iphone上发布我的应用程序。当我将链接从我的mackbook发送到iphone时。我收到一个错误,说“加载请求的应用程序时出现问题。看起来您可能正在使用LAN URL。确保您的设备与服务器位于同一网络上或尝试使用隧道。”我在同一个网络上。我检查了两次网络。这些是我遵循的步骤1)我通过在终端窗口中给出“npm start”命令来启动应用程序。2)我选择选项“s”,然

  • 我正在按照本指南将MySql添加到一个已经存在的SpringBoot项目中,该项目的依赖关系管理是在Graddle上。就在我添加教程中使用的这三个类时,如下所示 main/java/net/code/model/users.java 我的类使用@SpringBoot main/java/net/code/app.java 但每当我运行该应用程序时,我总是收到下面的消息 我搜索了一些相关问题,比如S

  • 我有一个集群,我可以成功启动,至少这是出现在web UI上,我在其中看到这些信息 我收到这个消息 使用REST应用程序提交协议运行Spark。使用Spark默认的log4j配置文件:org/apache/spark/log4j-defaults.properties 16/08/31 16:59:06 INFO restsubmissionclient:提交请求以在Spark://name25:6

  • 我一直在努力让我的第一个Android应用程序工作。我有一个使用webview的活动,我用它来打开上面有html表单的网页。 让“选择文件”按钮(用于文件输入)工作有些困难,但多亏了这里发布的在网络视图中上传文件的帮助,我终于解决了这个问题。从那里,我基本上使用了他们在Github上提供的主活动java代码。 我的实际问题是,当点击一个文件输入按钮时,我没有让用户使用我想要的设备摄像头的选项。起初

  • 我将遵循以下教程: https://blog.expo.io/building-a-react-native-app-using-expo-and-typescript-part-1-a81b6970bb82 我和我的手机(Android)在同一个网络上。没有VPN。我在我的应用程序的根文件夹中。它说所以我知道它正在运行。 防火墙也为此关闭,这不是超时错误。 当我扫描二维码时: 我有什么问题? 编