Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/artemyarulin/react-native-eval
Call any JS functions from your native code
https://github.com/artemyarulin/react-native-eval
Last synced: 5 days ago
JSON representation
Call any JS functions from your native code
- Host: GitHub
- URL: https://github.com/artemyarulin/react-native-eval
- Owner: artemyarulin
- License: mit
- Archived: true
- Created: 2015-04-22T10:17:18.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2019-07-09T08:49:45.000Z (over 5 years ago)
- Last Synced: 2024-11-08T23:52:46.622Z (about 1 month ago)
- Language: Java
- Size: 394 KB
- Stars: 83
- Watchers: 9
- Forks: 16
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-react-native - react-native-eval ★75 - Call any JS functions from your native code (Components / Utils & Infra)
- awesome-react-native - react-native-eval ★75 - Call any JS functions from your native code (Components / Utils & Infra)
- awesome-react-native - react-native-eval ★75 - Call any JS functions from your native code (Components / Utils & Infra)
- awesome-react-native-ui - react-native-eval ★51 - Call any JS functions from your native code (Components / Utils & Infra)
- awesome-react-native - react-native-eval ★75 - Call any JS functions from your native code (Components / Utils & Infra)
README
# react-native-eval
React has a good [tutorial](http://facebook.github.io/react-native/docs/embedded-app-ios.html#content) how to integrate React View to already existing application, but it doesn't provide a good way if you decided to migrate some of your business logic to JS first while maintaining the same UI.
## Automatic installation
* `npm install react-native-eval && react-native link react-native-eval`
### Manual installation `iOS`
* `pod init`. Initialize [CocoaPods](https://cocoapods.org/).
* Add following line to Podfile: `pod 'react-native-eval',:path => 'node_modules/react-native-eval/ios'`
* `pod install`. Update the project.### Manual installation `Android`
* `android/settings.gradle`
```gradle
...
include ':react-native-eval'
project(':react-native-eval').projectDir = new File(settingsDir, '../node_modules/react-native-eval/android')
```
* `android/app/build.gradle````gradle
dependencies {
...
compile project(':react-native-eval')
}
```* register module (in MainActivity.java)
```java
...import com.evaluator.react.*; // <--- import
public class MainActivity extends Activity implements DefaultHardwareBackBtnHandler {
...@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);mReactInstanceManager = ReactInstanceManager.builder()
.setApplication(getApplication())
.setBundleAssetName("index.android.bundle")
.setJSMainModuleName("index.android")
.addPackage(new MainReactPackage())
.addPackage(new RNMEPackage()) // <- add here
.setUseDeveloperSupport(BuildConfig.DEBUG)
.setInitialLifecycleState(LifecycleState.RESUMED)
.build();try {
Method method = getReactContextInitialize();
method.setAccessible(true);
method.invoke(mReactInstanceManager);
method.setAccessible(false);
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}setContentView(R.layout.activity_main);
}private Method getReactContextInitialize() {
Method method;
try {
// RN 14
method = mReactInstanceManager.getClass()
.getDeclaredMethod("initializeReactContext");
} catch (NoSuchMethodException e) {
method = null;
}if (method == null) {
try {
// RN 15
method = mReactInstanceManager.getClass()
.getDeclaredMethod("createReactContextInBackground");
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}return method;
}
}
```Buckle up, Dorothy
# iOS
* Get a reference to `RCTBridge`, by getting it from `RCTRootView.bridge` that you have created (if you have any React Native view) or by creating `RCTBridge` manually:
```objc
RCTBridge* bridge = [[RCTBridge alloc] initWithBundleURL:[NSURL URLWithString:@"URL_TO_BUNDLE"]
moduleProvider:nil
launchOptions:nil];
RCTRootView* view = [[RCTRootView alloc] initWithBridge:bridge moduleName:@"app"];// Call sync function
[RNMEvaluator callSyncFunction:bridge
name:@"Math.pow"
args:@[@2,@2]
cb:^(NSString *error, id returnValue) {
if (error)
NSLog(@"Error occured: %@", error);
else
NSLog(@"Function returned: %@", returnValue);
}];// You can call async function as well. It has to have callback as a last argument.
// If callback would be called with Error object then it will be converted to
// NSString and passed as a first argument of native callback. Otherwise callback
// value would be passed as a second parameter
[RNMEvaluator callAsyncFunction:bridge
name:@"(function(a,b,cb) { setTimeout(function() { cb(Math.pow(a,b)) },0) })"
args:@[@2,@2]
cb:^(NSString *error, id returnValue) {
if (error)
NSLog(@"Error occured: %@", error);
else
NSLog(@"Function returned: %@", returnValue);
}]
```# Javascript
* Call `require('react-native-eval')`, to ensure that the module is included.