3
3
// TODO: Support control of visible items
4
4
import _ from 'lodash' ;
5
5
import React , { useCallback , useRef } from 'react' ;
6
- import { TextStyle } from 'react-native' ;
6
+ import { TextStyle , FlatList } from 'react-native' ;
7
7
import Animated from 'react-native-reanimated' ;
8
8
import { onScrollEvent , useValues } from 'react-native-redash' ;
9
9
@@ -12,29 +12,25 @@ import {Constants} from '../../helpers';
12
12
13
13
import Item , { ItemProps } from './Item' ;
14
14
15
+ const AnimatedFlatList = Animated . createAnimatedComponent ( FlatList ) ;
16
+
15
17
export interface WheelPickerProps {
16
18
items ?: ItemProps [ ] ;
17
19
itemHeight ?: number ;
18
20
itemTextStyle ?: TextStyle ;
19
21
onChange : ( item : ItemProps , index : number ) => void ;
20
22
}
21
23
22
- const WheelPicker = ( {
23
- items,
24
- itemHeight = 48 ,
25
- itemTextStyle
26
- } : WheelPickerProps ) => {
24
+ const WheelPicker = ( { items, itemHeight = 48 , itemTextStyle} : WheelPickerProps ) => {
27
25
const height = itemHeight * 4 ;
28
26
const scrollview = useRef < Animated . ScrollView > ( ) ;
29
27
const [ offset ] = useValues ( [ 0 ] , [ ] ) ;
30
28
const onScroll = onScrollEvent ( { y : offset } ) ;
31
29
32
30
const selectItem = useCallback (
33
- ( index ) => {
31
+ index => {
34
32
if ( scrollview . current ) {
35
- scrollview . current
36
- . getNode ( )
37
- . scrollTo ( { y : index * itemHeight , animated : true } ) ;
33
+ scrollview . current . getNode ( ) . scrollTo ( { y : index * itemHeight , animated : true } ) ;
38
34
}
39
35
} ,
40
36
[ itemHeight ]
@@ -44,10 +40,25 @@ const WheelPicker = ({
44
40
// TODO: need to implement on change event that calc the current selected index
45
41
} , [ itemHeight ] ) ;
46
42
43
+ const renderItem = useCallback ( ( { item, index} ) => {
44
+ return (
45
+ < Item
46
+ index = { index }
47
+ itemHeight = { itemHeight }
48
+ offset = { offset }
49
+ textStyle = { itemTextStyle }
50
+ { ...item }
51
+ onSelect = { selectItem }
52
+ />
53
+ ) ;
54
+ } , [ ] ) ;
55
+
47
56
return (
48
57
< View >
49
58
< View width = { 250 } height = { height } br20 >
50
- < Animated . ScrollView
59
+ < AnimatedFlatList
60
+ data = { items }
61
+ keyExtractor = { keyExtractor }
51
62
scrollEventThrottle = { 16 }
52
63
onScroll = { onScroll }
53
64
onMomentumScrollEnd = { onChange }
@@ -59,21 +70,8 @@ const WheelPicker = ({
59
70
} }
60
71
snapToInterval = { itemHeight }
61
72
decelerationRate = { Constants . isAndroid ? 0.98 : 'normal' }
62
- >
63
- { _ . map ( items , ( item , index ) => {
64
- return (
65
- < Item
66
- key = { item . value }
67
- index = { index }
68
- itemHeight = { itemHeight }
69
- offset = { offset }
70
- textStyle = { itemTextStyle }
71
- { ...item }
72
- onSelect = { selectItem }
73
- />
74
- ) ;
75
- } ) }
76
- </ Animated . ScrollView >
73
+ renderItem = { renderItem }
74
+ />
77
75
< View absF centerV pointerEvents = "none" >
78
76
< View
79
77
style = { {
@@ -88,4 +86,6 @@ const WheelPicker = ({
88
86
) ;
89
87
} ;
90
88
89
+ const keyExtractor = ( item : ItemProps ) => item . value ;
90
+
91
91
export default WheelPicker ;
0 commit comments