Необработанное отклонение обещания при использовании собственных модулей из React Native после реализации собственного модуля Toast - PullRequest
2 голосов
/ 11 июля 2019

Я пытаюсь реализовать Toast, создав модуль в React Native, но когда я пытаюсь выполнить его в части JavaScript, я получаю этот YellowBox:

Warning Possible Unhandled Promise Rejection (id: 0)
TypeError: null is not an object (evaluating '_modules.Toast.show')

Создание модуля

package com.project-name.modules;

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 {
  public ToastModule(ReactApplicationContext reactContext) {
    super(reactContext);
  }

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

  @ReactMethod
  public void show(String message, int duration) {
    Toast.makeText(getReactApplicationContext(), message, Toast.LENGTH_SHORT).show();
  }
}

Регистрация модуля

package com.project-name;

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;

import com.project-name.modules.ToastModule;

public class ToastPackage 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;
  }
}

А потом я добавил это к своему MainApplication.java

...
import com.facebook.react.shell.MainReactPackage;
import com.project-name.ToastPackage;
...
protected List getPackages() {
  return Arrays.asList(
    new MainReactPackage(),
    new ToastPackage()
  );
}

Теперь в части JavaScript я создал файл в utils/modules.js:

import { NativeModules } from 'react-native'

const { Toast } = NativeModules

export { Toast }

Который я потом в своем компоненте называю

import { Toast } from '../../utils/modules'
...
Toast.show('Foo!')
...

Может кто-нибудь сказать, пожалуйста, что не так? Я следовал официальному руководству на веб-сайте, но появляется это предупреждение.

1 Ответ

0 голосов
/ 14 июля 2019

Убедитесь, что приложение перестроено после добавления кода моста Android. Кроме того, ваш интерфейс метода show имеет дополнительный (неиспользуемый) параметр длительности, который не упоминается при вызове метода из React-Native.

...