mirror of
https://github.com/zhigang1992/react-native-paper.git
synced 2026-06-14 18:09:24 +08:00
feat: add <RadioButton /> component. fixes #13
This commit is contained in:
@@ -16,6 +16,7 @@ import CheckboxExample from './CheckboxExample';
|
||||
import DividerExample from './DividerExample';
|
||||
import PaperExample from './PaperExample';
|
||||
import RippleExample from './RippleExample';
|
||||
import RadioButtonExample from './RadioButtonExample';
|
||||
import TextExample from './TextExample';
|
||||
|
||||
export const examples = {
|
||||
@@ -25,6 +26,7 @@ export const examples = {
|
||||
divider: DividerExample,
|
||||
paper: PaperExample,
|
||||
ripple: RippleExample,
|
||||
radio: RadioButtonExample,
|
||||
text: TextExample,
|
||||
};
|
||||
|
||||
|
||||
67
example/src/RadioButtonExample.js
Normal file
67
example/src/RadioButtonExample.js
Normal file
@@ -0,0 +1,67 @@
|
||||
/* @flow */
|
||||
|
||||
import React, { Component } from 'react';
|
||||
import {
|
||||
View,
|
||||
StyleSheet,
|
||||
} from 'react-native';
|
||||
import {
|
||||
Paragraph,
|
||||
RadioButton,
|
||||
Colors,
|
||||
} from 'react-native-paper';
|
||||
|
||||
export default class RadioButtonExample extends Component {
|
||||
|
||||
static title = 'Radio button';
|
||||
|
||||
state = {
|
||||
checkedNormal: true,
|
||||
checkedCustom: true,
|
||||
};
|
||||
|
||||
render() {
|
||||
return (
|
||||
<View style={styles.container}>
|
||||
<View style={styles.row}>
|
||||
<Paragraph>Normal</Paragraph>
|
||||
<RadioButton
|
||||
checked={this.state.checkedNormal}
|
||||
onPress={() => this.setState(state => ({ checkedNormal: !state.checkedNormal }))}
|
||||
/>
|
||||
</View>
|
||||
<View style={styles.row}>
|
||||
<Paragraph>Custom</Paragraph>
|
||||
<RadioButton
|
||||
color={Colors.pink500}
|
||||
checked={this.state.checkedCustom}
|
||||
onPress={() => this.setState(state => ({ checkedCustom: !state.checkedCustom }))}
|
||||
/>
|
||||
</View>
|
||||
<View style={styles.row}>
|
||||
<Paragraph>Checked (Disabled)</Paragraph>
|
||||
<RadioButton checked disabled />
|
||||
</View>
|
||||
<View style={styles.row}>
|
||||
<Paragraph>Unchecked (Disabled)</Paragraph>
|
||||
<RadioButton checked={false} disabled />
|
||||
</View>
|
||||
</View>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
const styles = StyleSheet.create({
|
||||
container: {
|
||||
flex: 1,
|
||||
backgroundColor: Colors.white,
|
||||
padding: 8,
|
||||
},
|
||||
|
||||
row: {
|
||||
flexDirection: 'row',
|
||||
alignItems: 'center',
|
||||
justifyContent: 'space-between',
|
||||
padding: 8,
|
||||
},
|
||||
});
|
||||
1
index.js
1
index.js
@@ -9,6 +9,7 @@ export { default as Button } from './src/components/Button';
|
||||
export { default as Card } from './src/components/Card';
|
||||
export { default as Checkbox } from './src/components/Checkbox';
|
||||
export { default as Paper } from './src/components/Paper';
|
||||
export { default as RadioButton } from './src/components/RadioButton';
|
||||
export { default as TouchableRipple } from './src/components/TouchableRipple';
|
||||
|
||||
export { default as Caption } from './src/components/Typography/Caption';
|
||||
|
||||
82
src/components/RadioButton.js
Normal file
82
src/components/RadioButton.js
Normal file
@@ -0,0 +1,82 @@
|
||||
/* @flow */
|
||||
|
||||
import React, {
|
||||
PropTypes,
|
||||
} from 'react';
|
||||
import {
|
||||
StyleSheet,
|
||||
} from 'react-native';
|
||||
import color from 'color';
|
||||
import Icon from './Icon';
|
||||
import TouchableRipple from './TouchableRipple';
|
||||
import withTheme from '../core/withTheme';
|
||||
import type { Theme } from '../types/Theme';
|
||||
|
||||
type Props = {
|
||||
checked: boolean;
|
||||
disabled?: boolean;
|
||||
onPress?: Function;
|
||||
color?: string;
|
||||
theme: Theme;
|
||||
}
|
||||
|
||||
const RadioButton = (props: Props) => {
|
||||
const {
|
||||
checked,
|
||||
disabled,
|
||||
onPress,
|
||||
theme,
|
||||
} = props;
|
||||
|
||||
const radioColor = props.color || theme.colors.primary;
|
||||
|
||||
let rippleColor, radioStyle;
|
||||
|
||||
if (disabled) {
|
||||
rippleColor = 'rgba(0, 0, 0, .16)';
|
||||
radioStyle = { color: 'rgba(0, 0, 0, .26)' };
|
||||
} else {
|
||||
rippleColor = color(radioColor).clearer(0.32).rgbaString();
|
||||
if (checked) {
|
||||
radioStyle = { color: radioColor };
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<TouchableRipple
|
||||
{...props}
|
||||
borderless
|
||||
rippleColor={rippleColor}
|
||||
onPress={disabled ? undefined : onPress}
|
||||
style={styles.container}
|
||||
>
|
||||
<Icon
|
||||
name={checked ? 'radio-button-checked' : 'radio-button-unchecked'}
|
||||
size={24}
|
||||
style={[ styles.radio, radioStyle ]}
|
||||
/>
|
||||
</TouchableRipple>
|
||||
);
|
||||
};
|
||||
|
||||
RadioButton.propTypes = {
|
||||
checked: PropTypes.bool.isRequired,
|
||||
disabled: PropTypes.bool,
|
||||
onPress: PropTypes.func,
|
||||
color: PropTypes.string,
|
||||
theme: PropTypes.object.isRequired,
|
||||
};
|
||||
|
||||
const styles = StyleSheet.create({
|
||||
container: {
|
||||
borderRadius: 18,
|
||||
},
|
||||
|
||||
radio: {
|
||||
/* FIXME: using opacity doesn't work properly with TouchableHighlight */
|
||||
color: 'rgba(0, 0, 0, .54)',
|
||||
margin: 6,
|
||||
},
|
||||
});
|
||||
|
||||
export default withTheme(RadioButton);
|
||||
Reference in New Issue
Block a user