Release React Native for Android
This is an early release and there are several things that are known not to work if you're porting your iOS app to Android. See the Known Issues guide on the website. We will work with the community to reach platform parity with iOS.
BIN
website/src/react-native/img/AndroidSDK1.png
Normal file
|
After Width: | Height: | Size: 380 KiB |
BIN
website/src/react-native/img/AndroidSDK2.png
Normal file
|
After Width: | Height: | Size: 366 KiB |
BIN
website/src/react-native/img/CreateAVD.png
Normal file
|
After Width: | Height: | Size: 85 KiB |
BIN
website/src/react-native/img/TutorialFinal2.png
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
website/src/react-native/img/TutorialMock2.png
Normal file
|
After Width: | Height: | Size: 8.4 KiB |
BIN
website/src/react-native/img/TutorialSingleFetched2.png
Normal file
|
After Width: | Height: | Size: 9.2 KiB |
BIN
website/src/react-native/img/TutorialStyledMock2.png
Normal file
|
After Width: | Height: | Size: 8.6 KiB |
148
website/src/react-native/index.js
vendored
@@ -41,12 +41,14 @@ var index = React.createClass({
|
||||
|
||||
<div style={{margin: '40px auto', maxWidth: 800}}>
|
||||
|
||||
<h2>Native iOS Components</h2>
|
||||
<h2>Native Components</h2>
|
||||
<p>
|
||||
With React Native, you can use the standard platform components such as UITabBar and UINavigationController on iOS. This gives your app a consistent look and feel with the rest of the platform ecosystem, and keeps the quality bar high. These components are easily incorporated into your app using their React component counterparts, such as TabBarIOS and NavigatorIOS.
|
||||
With React Native, you can use the standard platform components such as UITabBar on iOS and Drawer on Android. This gives your app a consistent look and feel with the rest of the platform ecosystem, and keeps the quality bar high. These components are easily incorporated into your app using their React component counterparts, such as TabBarIOS and DrawerLayoutAndroid.
|
||||
</p>
|
||||
<Prism>
|
||||
{`var React = require('react-native');
|
||||
{`// iOS
|
||||
|
||||
var React = require('react-native');
|
||||
var { TabBarIOS, NavigatorIOS } = React;
|
||||
|
||||
var App = React.createClass({
|
||||
@@ -62,6 +64,24 @@ var App = React.createClass({
|
||||
});`}
|
||||
</Prism>
|
||||
|
||||
<Prism>
|
||||
{`// Android
|
||||
|
||||
var React = require('react-native');
|
||||
var { DrawerLayoutAndroid, ProgressBarAndroid } = React;
|
||||
|
||||
var App = React.createClass({
|
||||
render: function() {
|
||||
return (
|
||||
<DrawerLayoutAndroid
|
||||
renderNavigationView={() => <Text>React Native</Text>}>
|
||||
<ProgressBarAndroid />
|
||||
</DrawerLayoutAndroid>
|
||||
);
|
||||
},
|
||||
});`}
|
||||
</Prism>
|
||||
|
||||
<h2>Asynchronous Execution</h2>
|
||||
<p>
|
||||
All operations between the JavaScript application code and the native platform are performed asynchronously, and the native modules can also make use of additional threads as well. This means we can decode images off of the main thread, save to disk in the background, measure text and compute layouts without blocking the UI, and more. As a result, React Native apps are naturally fluid and responsive. The communication is also fully serializable, which allows us to leverage Chrome Developer Tools to debug the JavaScript while running the complete app, either in the simulator or on a physical device.
|
||||
@@ -73,10 +93,12 @@ var App = React.createClass({
|
||||
|
||||
<h2>Touch Handling</h2>
|
||||
<p>
|
||||
iOS has a very powerful system called the Responder Chain to negotiate touches in complex view hierarchies which does not have a universal analog on the web. React Native implements a similar responder system and provides high level components such as TouchableHighlight that integrate properly with scroll views and other elements without any additional configuration.
|
||||
React Native implements a powerful system to negotiate touches in complex view hierarchies and provides high level components such as TouchableHighlight that integrate properly with scroll views and other elements without any additional configuration.
|
||||
</p>
|
||||
<Prism>
|
||||
{`var React = require('react-native');
|
||||
{`// iOS & Android
|
||||
|
||||
var React = require('react-native');
|
||||
var { ScrollView, TouchableHighlight, Text } = React;
|
||||
|
||||
var TouchDemo = React.createClass({
|
||||
@@ -97,7 +119,9 @@ var TouchDemo = React.createClass({
|
||||
Laying out views should be easy, which is why we brought the flexbox layout model from the web to React Native. Flexbox makes it simple to build the most common UI layouts, such as stacked and nested boxes with margin and padding. React Native also supports common web styles, such as fontWeight, and the StyleSheet abstraction provides an optimized mechanism to declare all your styles and layout right along with the components that use them and apply them inline.
|
||||
</p>
|
||||
<Prism>
|
||||
{`var React = require('react-native');
|
||||
{`// iOS & Android
|
||||
|
||||
var React = require('react-native');
|
||||
var { Image, StyleSheet, Text, View } = React;
|
||||
|
||||
var ReactNative = React.createClass({
|
||||
@@ -134,7 +158,9 @@ var styles = StyleSheet.create({
|
||||
React Native is focused on changing the way view code is written. For the rest, we look to the web for universal standards and polyfill those APIs where appropriate. You can use npm to install JavaScript libraries that work on top of the functionality baked into React Native, such as XMLHttpRequest, window.requestAnimationFrame, and navigator.geolocation. We are working on expanding the available APIs, and are excited for the Open Source community to contribute as well.
|
||||
</p>
|
||||
<Prism>
|
||||
{`var React = require('react-native');
|
||||
{`// iOS (Android support for geolocation coming)
|
||||
|
||||
var React = require('react-native');
|
||||
var { Text } = React;
|
||||
|
||||
var GeoInfo = React.createClass({
|
||||
@@ -159,7 +185,11 @@ var GeoInfo = React.createClass({
|
||||
|
||||
<h2>Extensibility</h2>
|
||||
<p>
|
||||
It is certainly possible to create a great app using React Native without writing a single line of native code, but React Native is also designed to be easily extended with custom native views and modules - that means you can reuse anything you{"'"}ve already built, and can import and use your favorite native libraries. To create a simple module in iOS, create a new class that implements the RCTBridgeModule protocol, and wrap the function that you want to make available to JavaScript in RCT_EXPORT_METHOD. Additionally, the class itself must be explicitly exported with RCT_EXPORT_MODULE();.
|
||||
It is certainly possible to create a great app using React Native without writing a single line of native code, but React Native is also designed to be easily extended with custom native views and modules - that means you can reuse anything you{"'"}ve already built, and can import and use your favorite native libraries.
|
||||
</p>
|
||||
<h3>Creating iOS modules</h3>
|
||||
<p>
|
||||
To create a simple iOS module, create a new class that implements the RCTBridgeModule protocol, and wrap the function that you want to make available to JavaScript in RCT_EXPORT_METHOD. Additionally, the class itself must be explicitly exported with RCT_EXPORT_MODULE();.
|
||||
</p>
|
||||
<Prism>
|
||||
{`// Objective-C
|
||||
@@ -202,6 +232,8 @@ var Message = React.createClass({
|
||||
}
|
||||
});`}
|
||||
</Prism>
|
||||
|
||||
<h3>Creating iOS views</h3>
|
||||
<p>
|
||||
Custom iOS views can be exposed by subclassing RCTViewManager, implementing a -(UIView *)view method, and exporting properties with the RCT_EXPORT_VIEW_PROPERTY macro. Then a simple JavaScript file connects the dots.
|
||||
</p>
|
||||
@@ -243,6 +275,105 @@ MyCustomView.propTypes = {
|
||||
var NativeMyCustomView = requireNativeComponent('MyCustomView', MyCustomView);
|
||||
module.exports = MyCustomView;`}
|
||||
</Prism>
|
||||
|
||||
<h3>Creating Android modules</h3>
|
||||
<p>
|
||||
Likewise, Android also supports custom extensions, the methods are just slightly different.
|
||||
</p>
|
||||
<p>
|
||||
To create a simple module in Android, create a new class that extends the ReactContextBaseJavaModule class, and annotate the function that you want to make available to JavaScript with @ReactMethod. Additionally, the class itself must be registered in the ReactPackage of your React Native application.
|
||||
</p>
|
||||
<Prism>
|
||||
{`// Java
|
||||
|
||||
public class MyCustomModule extends ReactContextBaseJavaModule {
|
||||
|
||||
// Available as NativeModules.MyCustomModule.processString
|
||||
@ReactMethod
|
||||
public void processString(String input, Callback callback) {
|
||||
callback.invoke(input.replace("Goodbye", "Hello");
|
||||
}
|
||||
}
|
||||
`}
|
||||
</Prism>
|
||||
|
||||
<Prism>
|
||||
{`// JavaScript
|
||||
|
||||
var React = require('react-native');
|
||||
var { NativeModules, Text } = React;
|
||||
var Message = React.createClass({
|
||||
getInitialState() {
|
||||
return { text: 'Goodbye World.' };
|
||||
},
|
||||
componentDidMount() {
|
||||
NativeModules.MyCustomModule.processString(this.state.text, (text) => {
|
||||
this.setState({text});
|
||||
});
|
||||
},
|
||||
render: function() {
|
||||
return (
|
||||
<Text>{this.state.text}</Text>
|
||||
);
|
||||
}
|
||||
});
|
||||
`}
|
||||
</Prism>
|
||||
|
||||
<h3>Creating Android views</h3>
|
||||
<p>
|
||||
Custom Android views can be exposed by extending SimpleViewManager, implementing a createViewInstance and getName methods, and exporting properties with the @UIProp annotation. Then a simple JavaScript file connects the dots.
|
||||
</p>
|
||||
<Prism>
|
||||
{`// Java
|
||||
|
||||
public class MyCustomViewManager extends SimpleViewManager<MyCustomView> {
|
||||
|
||||
private static final String REACT_CLASS = "MyCustomView";
|
||||
|
||||
@UIProp(UIProp.Type.STRING)
|
||||
public static final String PROP_MY_CUSTOM_PROPERTY = "myCustomProperty";
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return REACT_CLASS;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected MyCustomView createViewInstance(ThemedReactContext reactContext) {
|
||||
return new MyCustomView(reactContext)
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateView(MyCustomView view, CatalystStylesDiffMap props) {
|
||||
super.updateView(view, props);
|
||||
|
||||
if (props.hasKey(PROP_MY_CUSTOM_PROPERTY)) {
|
||||
view.setMyCustomProperty(props.getString(PROP_MY_CUSTOM_PROPERTY));
|
||||
}
|
||||
}
|
||||
}
|
||||
`}
|
||||
</Prism>
|
||||
<Prism>
|
||||
{`// JavaScript
|
||||
|
||||
var React = require('react-native');
|
||||
var { requireNativeComponent } = React;
|
||||
|
||||
class MyCustomView extends React.Component {
|
||||
render() {
|
||||
return <NativeMyCustomView {...this.props} />;
|
||||
}
|
||||
}
|
||||
MyCustomView.propTypes = {
|
||||
myCustomProperty: React.PropTypes.oneOf(['a', 'b']),
|
||||
};
|
||||
|
||||
var NativeMyCustomView = requireNativeComponent('MyCustomView', MyCustomView);
|
||||
module.exports = MyCustomView;
|
||||
`}
|
||||
</Prism>
|
||||
</div>
|
||||
<section className="home-bottom-section">
|
||||
<div className="buttons-unit">
|
||||
@@ -256,3 +387,4 @@ module.exports = MyCustomView;`}
|
||||
});
|
||||
|
||||
module.exports = index;
|
||||
|
||||
|
||||