Obecnie mam zarówno Push i Pop skonfigurować za pomocą NavigationStateUtils przy użyciu React Native/Redux. Ale gdy przycisk uruchamiający akcję Push zostanie naciśnięty więcej niż jeden raz, pojawia się błąd: should not push * route with duplicated key
i * reprezentujący route.key
lub this.props.navKey
.Jak utworzyć klucz unikalny dla obiektu NavigationStateUtils za pomocą funkcji push route w React Native/Redux?
Co może być przyczyną błędu? Jak mam utworzyć unikalny klucz dla każdej pojedynczej trasy, używając NavigationStateUtils
?
To jest mój set up - Redux:
function mapStateToProps(state) {
return {
navigation: state.navReducer,
}
}
export default connect(
mapStateToProps,
{
pushRoute: (route) => push(route),
popRoute:() => pop(),
}
)(NavigationRoot)
Mój reduktor (navReducer.js
):
const initialState = {
index: 0,
key: 'root',
routes: [{
key: 'login',
title: 'Login',
component: Login,
direction: 'horizontal',
}]
}
function navigationState (state = initialState, action) {
switch(action.type) {
case PUSH_ROUTE:
if (state.routes[state.index].key === (action.route && action.route.key)) return state
return NavigationStateUtils.push(state, action.route)
case POP_ROUTE:
if (state.index === 0 || state.routes.length === 1) return state
return NavigationStateUtils.pop(state)
default:
return state
}
}
export default navigationState
A te metody obsługi Push i Pop oraz jak pasek nawigacyjny z powrotem (pop) przycisku skonfigurowano:
_renderScene (props) {
const { route } = props.scene
return (
<route.component _handleNavigate={this._handleNavigate.bind(this)} {...route.passProps} actions={this.props}/>
)
}
_handleBackAction() {
if (this.props.navigation.index === 0) {
return false
}
this.props.popRoute()
return true
}
_handleNavigate(action) {
switch (action && action.type) {
case 'push':
this.props.pushRoute(action.route)
return true
case 'back':
case 'pop':
return this._handleBackAction()
default:
return false
}
}
renderOverlay = (sceneProps) => {
if(0 < sceneProps.scene.index)
{
return (
<NavigationHeader
{...sceneProps}
renderLeftComponent={() => {
switch(sceneProps.scene.route.title){
case 'Home':
return (
<TouchableHighlight onPress={() => this._handleBackAction()}>
<Text}>X</Text>
</TouchableHighlight>
)
}
}
}
/>
)
}
}
render() {
return (
<NavigationCardStack
direction={this.props.navigation.routes[this.props.navigation.index].direction}
navigationState={this.props.navigation}
onNavigate={this._handleNavigate.bind(this)}
renderScene={this._renderScene}
renderOverlay={this.renderOverlay}
/>
)
}
I wywołane przez takie komponenty jak tak:
const route = {
home: {
type: 'push',
route: {
key: 'home',
title: 'Home',
component: Home,
direction: 'vertical',
}
}
}
dziennika konsola EDIT
EDIT 2 Kontynuacja
EDIT 3 Przesuń Menu
Przepraszam, ale czy mógłbyś wyjaśnić na swoim pytaniu i pokazać, co masz na myśli, mówiąc, że funkcja 'connect' nie odwzorowuje' dispatch' z podanym przeze mnie kodem? –
Jak wymyśliłeś: '{ pushRoute: (trasa) => push (trasa), popRoute:() => pop(), }'? z dokumentacji "react-redux"? Ma być podpisem funkcji. – rclai
https://medium.com/@dabit3/react-native-navigator-experimental-part-2-implementing-redux-c6acbf66eca1#.trrcjkhju stąd –