【问题标题】:createBottomTabNavigator: how do I reload/refresh a tab screen on tab on the tab-icon?createBottomTabNavigator:如何在选项卡图标上的选项卡上重新加载/刷新选项卡屏幕?
【发布时间】:2018-06-21 05:58:25
【问题描述】:

所以我有一个带有 3 个屏幕的 TabNavigator。

import React from 'react';
import {TabNavigator,createBottomTabNavigator } from 'react-navigation';


import ActivateScannerPage from '../pages/ActivateScannerPage';
import ScanTicketPage from '../pages/ScanTicketPage'; 
import HomePage from '../pages/HomePage'; 
import SwipeList from '../components/SwipeList';

import FontAwesome, { Icons } from 'react-native-fontawesome';
import { Icon } from 'react-native-elements';

export default createBottomTabNavigator (
    {
        HomeScreen:{
            screen:HomePage,
            navigationOptions: {
                tabBarIcon:()=>  
                <Icon
                name='home'
                type='font-awesome'
                color='#5bc0de'/>
            },
        },
        AcitvateScannerPage:{
            screen:ActivateScannerPage,
            navigationOptions: {
                tabBarIcon:()=>   <Icon
                name='qrcode'
                type='font-awesome'
                color='#5bc0de'/>
            },
        },
        ScanTicketPage:{
            screen:ScanTicketPage,
            navigationOptions: {
                tabBarIcon:()=>  <Icon
                name='ticket'
                type='font-awesome'
                color='#5bc0de'/>
            },
        },

    },
    {
        tabBarOptions: {
            activeTintColor: '#5bc0de',
            inactiveTintColor :'white',
            labelStyle: {
              fontSize: 12,
            },
            style: {
              backgroundColor: '#444444'
            },
          }
    }



);

当我点击 ActivateScannerPage 时,将打开用于扫描 QR 码的相机。

import React, { Component } from 'react';

import {
  StyleSheet,
  View,

} from 'react-native';

import QrCode from '../components/QrCode';

 class ActivateScannerPage extends Component {
  static navigationOptions = {
    title: 'Aktivierung Scanner',
  };


  constructor (props){
    super(props);
}



render(){
  return(
    <View style={styles.viewContent}>
       <QrCode scanner={true} headerText="Aktivieren Sie Ihren Scanner"/>
    </View>
  );
}

 }


 const styles = StyleSheet.create({
  viewContent:{
      flex:1
  }
 });

 export default ActivateScannerPage;

所以我的问题是当应用程序启动时,我点击“ActivateScannerPage/Aktivierung Scanner”选项卡,然后它会打开相机,我可以毫无问题地扫描我的代码。但是当我选择另一个 tabScreen 时,例如返回主屏幕,然后返回 AcitivateScannerPage,视图不会刷新或呈现新的。所以相机不再打开,我看到一个黑屏。

有没有办法解决这个问题?我可以通过点击 tabIcon 重新加载或重新渲染屏幕吗?

谢谢。

编辑:

import React, { Component } from 'react';

import {
  AppRegistry,
  StyleSheet,
  Text,
  View,
  AsyncStorage,
} from 'react-native';

import QRCodeScanner from 'react-native-qrcode-scanner';
import moment from 'moment';
import { Icon } from 'react-native-elements';

 class QrCode extends Component {


  static navigationOptions=(props)=>({
           title:  `${props.navigation.state.params.scannerName}`,
           headerTintColor: 'white',
           headerStyle: {backgroundColor: '#444444'},
           headerTitleStyle: { color: 'white' },

        })


  constructor(props){
    super(props);
    this.state={
     .....some states.....
  }

  }


  onSuccess(e) {

    ..... do something..... here I get my data which I use

  }


  fetchDataScanner(dataMacroID,requestKey,hash) {
......

  }

  fetchDataTicketCheck(dataMacroID,requestKey,ticketValue){
.....

  }

  fetchDataTicketValidate(dataMacroID,requestKey,dataMicroID,ticketValue){
 .....

  }

  saveDataScannerActivation=()=>{
   .....

}



  render() {
    return (
    <View style={styles.viewContent}>

    <View style={{flex:4}}>
    <QRCodeScanner 
      reactivateTimeout={2000}
      reactivate={true}
      onRead={this.onSuccess.bind(this)}
    />
    </View>

      </View>
    );
  }
}

......

export default QrCode;

【问题讨论】:

  • 我认为问题来自QrCode ,您应该在扫描二维码时更改它的状态。要检测活动屏幕,请参阅此stackoverflow.com/questions/50290818/…
  • 我不明白该放在哪里以及在哪里设置状态。我对此真的很陌生,我想避免使用redux!你的意思是我应该在 QrCode 中设置一个状态,然后在该状态更改时检查 ActivateScannerPage?但是我如何访问这个状态呢?
  • QrCode 可以重新加载它的状态吗?您可以在扫描二维码或ActivateScannerPage 处于活动状态后重新加载它
  • 我不知道,我必须实现它还是它是一个 react-native 基本功能?我在那里有很多功能正在改变状态。
  • 试试这个github.com/moaazsidat/react-native-qrcode-scanner。他们有reactivate()

标签: react-native react-native-tabnavigator


【解决方案1】:

在您为标签设计的屏幕中,必须执行流畅的步骤:

1:从react-navigation 导入withNavigationFocus 到你的班级。

2:然后像这样导出你的:export default withNavigationFocus(yourclassname)

3:使用此代码更新或管理您的状态

 shouldComponentUpdate = (nextProps, nextState) => {
if (nextProps.isFocused) {
  ...
  return true;
} else {
  ...
  return false;
}

};

【讨论】:

    【解决方案2】:

    使用react-navigation,您可以检测到ActivateScannerPage 何时处于活动状态/被点击。

    将此代码添加到componentDidMountActivateScannerPage

    this.subs = [
      this.props.navigation.addListener('didFocus', () => this.isFocused()),
    ];
    

    如果ActivateScannerPage 将卸载,则移除监听器

    componentWillUnmount() {
      this.subs.forEach(sub => sub.remove());
    }
    

    【讨论】:

    • 当我添加这个时,我得到一个错误“未定义不是一个函数...... this.isFocused”。什么是可重现的,因为函数没有定义。在 this.isFocused 方法中我要做什么?
    • 这是ActivateScannerPage中的一个方法,你必须创建它。当您选择 ActivateScannerPage 选项卡时会调用它,然后您可以在此处重置QrCode
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    相关资源
    最近更新 更多