2015-12-02 76 views
4

我試圖按照反應原生站點上的示例(https://github.com/facebook/react-native/tree/master/Examples/UIExplorer/Navigator)設置我的導航器,但似乎無法使其工作。無論我看起來如何,GoogSignIn場景總是空白,儘管它確實擊中了我的兩個console.log文件點。我嘗試將我的應用程序的起點切換到不同的場景,但同樣的事情總是發生。我認爲這是我用導航器在index.ios.js中做了錯誤的事情,但我不確定是什麼。任何幫助深表感謝。反應本機導航器 - 屏幕始終爲空

index.ios.js

'use strict'; 
var React = require('react-native'); 
var DataEntry = require('./app/DataEntry'); 
var PasswordView = require('./app/PasswordView'); 
var GoogSignIn = require('./app/GoogSignIn'); 


var { 
    AppRegistry, 
    Image, 
    StyleSheet, 
    Text, 
    View, 
    Navigator, 
    TouchableOpacity, 
} = React; 

class PasswordRecovery extends React.Component { 
    render() { 
    return (
     <Navigator 
     ref={this._setNavigatorRef} 
     style={styles.container} 
     initialRoute={{id: 'GoogSignIn', name: 'Index'}} 
     renderScene={this.renderScene} 
     configureScene={(route) => { 
      if (route.sceneConfig) { 
      return route.sceneConfig; 
      } 
      return Navigator.SceneConfigs.FloatFromRight; 
     }} /> 
    ); 
    } 

    renderScene(route, navigator) { 
    switch (route.id) { 
    case 'GoogSignIn': 
     return <GoogSignIn navigator={navigator} />; 
    case 'DataEntry': 
     return <DataEntry navigator={navigator} />; 
    case 'PasswordView': 
     return <PasswordView navigator={navigator} />; 
    default: 
     return this.noRoute(navigator); 
    } 

    noRoute(navigator) { 
    return (
     <View style={{flex: 1, alignItems: 'stretch', justifyContent: 'center'}}> 
     <TouchableOpacity style={{flex: 1, alignItems: 'center', justifyContent: 'center'}} 
      onPress={() => navigator.pop()}> 
      <Text style={{color: 'red', fontWeight: 'bold'}}>ERROR: NO ROUTE DETECTED</Text> 
     </TouchableOpacity> 
     </View> 
    ); 
    } 

    _setNavigatorRef(navigator) { 
    if (navigator !== this._navigator) { 
     this._navigator = navigator; 

     if (navigator) { 
     var callback = (event) => { 
      console.log(
      `TabBarExample: event ${event.type}`, 
      { 
       route: JSON.stringify(event.data.route), 
       target: event.target, 
       type: event.type, 
      } 
     ); 
     }; 
     // Observe focus change events from the owner. 
     this._listeners = [ 
      navigator.navigationContext.addListener('willfocus', callback), 
      navigator.navigationContext.addListener('didfocus', callback), 
     ]; 
     } 
    } 
    } 

    componentWillUnmount() { 
    this._listeners && this._listeners.forEach(listener => listener.remove()); 
    } 
} 

var styles = StyleSheet.create({ 
    container: { 
    flex: 1, 
    justifyContent: 'center', 
    alignItems: 'center', 
    backgroundColor: '#F5FCFF', 
    }, 
    welcome: { 
    fontSize: 20, 
    textAlign: 'center', 
    margin: 10, 
    }, 
    instructions: { 
    textAlign: 'center', 
    color: '#333333', 
    marginBottom: 5, 
    }, 
}); 


AppRegistry.registerComponent('PasswordRecovery',() => PasswordRecovery); 

我只是試圖讓這一切設置,這樣我可以在場景顯示谷歌的註冊,然後從那裏導航。對於那一幕至今的代碼是在這裏:

GoogSignIn.js

'use strict'; 

var React = require('react-native'); 
var { NativeAppEventEmitter } = require('react-native'); 
var GoogleSignin = require('react-native-google-signin'); 
var cssVar = require('cssVar'); 
var { Icon } = require('react-native-icons'); 

var { 
    AppRegistry, 
    StyleSheet, 
    Text, 
    View, 
    TouchableOpacity, 
    TouchableHighlight, 
    PixelRatio, 
    Navigator, 
} = React; 

var NavigationBarRouteMapper = { 

    LeftButton: function(route, navigator, index, navState) { 
    if (index === 0) { 
     return null; 
    } 

    var previousRoute = navState.routeStack[index - 1]; 
    return (
     <TouchableOpacity 
     onPress={() => navigator.pop()} 
     style={styles.navBarLeftButton}> 
     <Text style={[styles.navBarText, styles.navBarButtonText]}> 
      {previousRoute.title} 
     </Text> 
     </TouchableOpacity> 
    ); 
    }, 

    RightButton: function(route, navigator, index, navState) { 
    return (
     null 
    ); 
    }, 

    Title: function(route, navigator, index, navState) { 
    return (
     <Text style={[styles.navBarText, styles.navBarTitleText]}> 
     GOOGLE SIGN IN 
     </Text> 
    ); 
    }, 

}; 

class GoogSignin extends React.Component { 
    constructor(props) { 
    super(props); 
    this.state = { 
     user: null 
    }; 
    } 

    componentWillMount() { 
var navigator = this.props.navigator; 
var callback = (event) => { 
    console.log(
    `NavigationBarSample : event ${event.type}`, 
    { 
     route: JSON.stringify(event.data.route), 
     target: event.target, 
     type: event.type, 
    } 
); 
}; 

// Observe focus change events from this component. 
this._listeners = [ 
    navigator.navigationContext.addListener('willfocus', callback), 
    navigator.navigationContext.addListener('didfocus', callback), 
]; 
    } 

    componentWillUnmount() { 
    this._listeners && this._listeners.forEach(listener => listener.remove()); 
    } 

    componentDidMount() { 
    this._configureOauth(
     '105558473349-7usegucirv10bruohtogd0qtuul3kkhn.apps.googleusercontent.com' 
    ); 
    } 

    renderScene(route, navigator) { 
     console.log("HERE"); 
     return (
     <View style={styles.container}> 
      <TouchableHighlight onPress={() => {this._signIn(); }}> 
      <View style={{backgroundColor: '#f44336', flexDirection: 'row'}}> 
       <View style={{padding: 12, borderWidth: 1/2, borderColor: 'transparent', borderRightColor: 'white'}}> 
       <Icon 
        name='ion|social-googleplus' 
        size={24} 
        color='white' 
        style={{width: 24, height: 24}} 
       /> 
       </View> 
       <Text style={{color: 'white', padding: 12, marginTop: 2, fontWeight: 'bold'}}>Sign in with Google</Text> 
      </View> 
      </TouchableHighlight> 
     </View> 
    ); 
    } 

    render() { 
    return (
     <Navigator 
     debugOverlay={false} 
     style={styles.container} 
     renderScene={this.renderScene} 
     navigationBar={ 
     <Navigator.NavigationBar 
      routeMapper={NavigationBarRouteMapper} 
      style={styles.navBar}/> 
     }/> 
    ); 
    } 

    _configureOauth(clientId, scopes=[]) { 
    console.log("WE HERE") 
    GoogleSignin.configure(clientId, scopes); 

    NativeAppEventEmitter.addListener('googleSignInError', (error) => { 
     console.log('ERROR signin in', error); 
    }); 

    NativeAppEventEmitter.addListener('googleSignIn', (user) => { 
     console.log(user); 
     this.setState({user: user}); 
    }); 

    return true; 
    } 

    _signIn() { 
    GoogleSignin.signIn(); 
    } 

    _signOut() { 
    GoogleSignin.signOut(); 
    this.setState({user: null}); 
    } 
}; 

var styles = StyleSheet.create({ 
    container: { 
    flex: 1, 
    justifyContent: 'center', 
    alignItems: 'center', 
    backgroundColor: '#F5FCFF', 
    }, 
    messageText: { 
    fontSize: 17, 
    fontWeight: '500', 
    padding: 15, 
    marginTop: 50, 
    marginLeft: 15, 
    }, 
    button: { 
    backgroundColor: 'white', 
    padding: 15, 
    borderBottomWidth: 1/PixelRatio.get(), 
    borderBottomColor: '#CDCDCD', 
    }, 
    buttonText: { 
    fontSize: 17, 
    fontWeight: '500', 
    }, 
    navBar: { 
    backgroundColor: 'white', 
    }, 
    navBarText: { 
    fontSize: 16, 
    marginVertical: 10, 
    }, 
    navBarTitleText: { 
    color: cssVar('fbui-bluegray-60'), 
    fontWeight: '500', 
    marginVertical: 9, 
    }, 
    navBarLeftButton: { 
    paddingLeft: 10, 
    }, 
    navBarRightButton: { 
    paddingRight: 10, 
    }, 
    navBarButtonText: { 
    color: cssVar('fbui-accent-blue'), 
    }, 
    scene: { 
    flex: 1, 
    paddingTop: 20, 
    backgroundColor: '#EAEAEA', 
    }, 
}); 



module.exports = GoogSignin; 

編輯:

enter image description here

enter image description here

+0

在styles.appContainer上有flex:1屬性嗎? –

+0

對不起,我以前編輯過,只是容器,代碼更新,我附上檢查器中發生的一些截圖,如果這有助於所有@NaderDabit – seanscal

回答

-1

在你renderScene方法:檢查截圖,嘗試做這樣的事情(這也會幫助你刪除那個b ig開關):

Component = route.id 

    <View style={styles.container}> 
    <Component navigator={navigator} route={route} /> 
    </View> 

    styles = StyleSheet.create({ 
    container: 
     flex: 1 
    }) 
+0

這不適用於我,我想是因爲' route.id'是一個字符串。我可以用'GoogSignIn'替換視圖中的組件,但不會彈出錯誤 – seanscal