2015-10-15 6 views
5

Próbuję zaimplementować niestandardowy komponent natywny dla ReactNative. Zgodnie z dokumentacją stworzyłem wszystkie moje komponenty, jak poniżej. Ale wciąż dostaję błąd Wymagany nieznany moduł "MyCustomToast". Pomóż mi rozwiązać ten problem.React native Wymagany nieznany moduł niestandardowego komponentu natywnego

SampleToast.java:-

public class SampleToast extends ReactContextBaseJavaModule { 


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

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

@ReactMethod 
public void showToast(String message) { 
    Toast.makeText(getReactApplicationContext(), message, Toast.LENGTH_LONG).show(); 
} 

}

MakeReactPackage.java:-

public class MakeReactPackage implements ReactPackage { 
@Override 
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) { 

    List<NativeModule> modules = new ArrayList<>(); 
    modules.add(new SampleToast(reactContext)); 
    return modules; 

} 

@Override 
public List<Class<? extends JavaScriptModule>> createJSModules() { 
    return Collections.emptyList(); 
} 

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

}

MainAct ivity.java:-

public class MainActivity extends Activity implements DefaultHardwareBackBtnHandler { 

private ReactInstanceManager mReactInstanceManager; 
private ReactRootView mReactRootView; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mReactRootView = new ReactRootView(this); 

    mReactInstanceManager = ReactInstanceManager.builder() 
      .setApplication(getApplication()) 
      .setBundleAssetName("index.android.bundle") 
      .setJSMainModuleName("index.android") 
      .addPackage(new MainReactPackage()) 
      .addPackage(new MakeReactPackage()) 
      .setUseDeveloperSupport(BuildConfig.DEBUG) 
      .setInitialLifecycleState(LifecycleState.RESUMED) 
      .build(); 

    mReactRootView.startReactApplication(mReactInstanceManager, "HelloWorldBha", null); 

    setContentView(mReactRootView); 
} 

@Override 
public boolean onKeyUp(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_MENU && mReactInstanceManager != null) { 
     mReactInstanceManager.showDevOptionsDialog(); 
     return true; 
    } 
    return super.onKeyUp(keyCode, event); 
} 

@Override 
public void onBackPressed() { 
    if (mReactInstanceManager != null) { 
     mReactInstanceManager.onBackPressed(); 
    } else { 
     super.onBackPressed(); 
    } 
} 

@Override 
public void invokeDefaultOnBackPressed() { 
    super.onBackPressed(); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 

    if (mReactInstanceManager != null) { 
     mReactInstanceManager.onPause(); 
    } 
} 

@Override 
protected void onResume() { 
    super.onResume(); 

    if (mReactInstanceManager != null) { 
     mReactInstanceManager.onResume(this); 
    } 
}} 

I JS

reagują-native.js: -

MyCustomToast:require('MyCustomToast'), 

SampleToast.js: -

'use strict'; 

/** 
* This exposes the native ToastAndroid module as a JS module. This has a function 'show' 
* which takes the following parameters: 
* 
* 1. String message: A string with the text to toast 
* 2. int duration: The duration of the toast. May be ToastAndroid.SHORT or ToastAndroid.LONG 
*/ 
var { NativeModules } = require('react-native'); 
module.exports = NativeModules.MyCustomToast; 

Index.android.js: -

/** 
* Sample React Native App 
* https://github.com/facebook/react-native 
*/ 
'use strict'; 

var React = require('react-native'); 
var toastMessage = require('SampleToast') 
var { 
    AppRegistry, 
    StyleSheet, 
    Text, 
    View, 
    NativeModules 
    } = React; 




var HelloWorldBha = React.createClass({ 
    render: function() { 
     return (
      <View style={styles.container}> 
       <Text style={styles.welcome}> 
        Welcome to React Native! 
       </Text> 
       <Text style={styles.instructions}> 
        To get started, edit index.android.js 
       </Text> 
       <Text style={styles.instructions}> 
        Shake or press menu button for dev menu 
       </Text> 


       toastMessage.show('Bharath Kumar'); 

      </View> 
     ); 
    } 
}); 

var styles = StyleSheet.create({ 
    container: { 
     flex: 1, 
     justifyContent: 'center', 
     alignItems: 'center', 
     backgroundColor: '#F5FCFF', 
    }, 
    welcome: { 
     fontSize: 20, 
     textAlign: 'center', 
     margin: 10, 
    }, 
    instructions: { 
     textAlign: 'center', 
     color: '#333333', 
     marginBottom: 5, 
    }, 
}); 

AppRegistry.registerComponent('HelloWorldBha',() => HelloWorldBha); 

Odpowiedz

2

W SampleToast.js używają adnotacji providesModule. Więc SampleToast.js staje:

/** 
* @providesModule SampleToast 
*/ 

'use strict'; 

/** 
    * This exposes the native ToastAndroid module as a JS module. This has a function 'show' 
    * which takes the following parameters: 
    * 
    * 1. String message: A string with the text to toast 
    * 2. int duration: The duration of the toast. May be ToastAndroid.SHORT or ToastAndroid.LONG 
    */ 
var { NativeModules } = require('react-native'); 
module.exports = NativeModules.MyCustomToast; 

Alternatywnie, w przypadku korzystania require („”), w SampleToast Index.android.js wtedy trzeba dać ścieżkę względną. Więc jeśli SampleToast.js i Index.android.js mieszka w tym samym katalogu, musisz

var toastMessage = require('./SampleToast'); 

Osobiście wolę pierwszą opcję.

+0

Witam próbowałem, ale nie używam :( –

+0

Spróbuj usunąć "MyCustomToast: require ('MyCustomToast')" z react-native.js. To nie powinno być potrzebne. – Rhys