写一个react native自定义的版本升级弹框

效果:

下面上代码

class VersionModal extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
      isShow: false, //在父组件控制显示隐藏
      imgObjHg: 0  // 根据宽度拿到图片自适应高度
    }
  }
  componentDidMount() {
    const { width: screenWidth } = Dimensions.get('window')
    let cover = require('./../resources/images/updateVersion.png')
    let imageObj = Image.resolveAssetSource(cover)
    let { width, height } = imageObj
    // 根据屏幕宽度拿到图片自适应高度
    let myHeight = Math.floor(screenWidth / width * height); 
    this.setState({imgObjHg: myHeight})
  }
  
  //显示根据父组件传来的isShow来控制显示隐藏
  componentWillReceiveProps(nextProps) {
    this.setState({isShow: nextProps.isShow})
  }

  //在子组件修改父组件的数据
  componentWillUnmount() {
    this.props.showModal({isShow: false})
  }
  
  //版本下载升级
  update() {
    let self = this
    let {newVersion, apkLink} = self.props
    const android = RNFetchBlob.android

    async function crequestMultiplePermission() {
      try {
        let isOpen = await PermissionsAndroid.check(
          PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
        );

        if (!isOpen) {
          let res = await PermissionsAndroid.request(
            PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
          )
          if (res !== 'granted') {
            Alert.alert(
              '存储权限没打开',
              '请在手机的“设置”选项中,允许访问您的存储权限',
            )
          }
        } else {
          androidDownload()
        }
      } catch (err) {
        console.log(err)
      }
    }

    function androidDownload() {
      RNFetchBlob.config({
        addAndroidDownloads: {
          useDownloadManager: true,
          title: 'xxx.apk',
          description: '正在下载...',
          mime: 'application/vnd.android.package-archive',
          path: `${RNFetchBlob.fs.dirs.DownloadDir}/xxx${newVersion}.apk`,
          mediaScannable: true,
          notification: true,
        },
      })
        .fetch('GET', `${apkLink}`)
        .then(res => {
          //下载成功后自动打开安装已下载apk文件
          android.actionViewIntent(
            res.path(),
            'application/vnd.android.package-archive',
          );
        });
    }

    function appleDownload() {
      const appLink = 'xxxxxxx';
      Linking.openURL(appLink).catch(err =>
        console.error('An error occurred', err),
      );
    }

    if (Platform.OS === 'android') {
      crequestMultiplePermission();
      setTimeout(() => {this.props.showModal({isShow: false})},1000)
    } else {
      appleDownload();
      setTimeout(() => {this.props.showModal({isShow: false})},1000)
    }
    
  }

  render() {
    let self = this
    let {newVersion, showBack} = self.props
    return (
      <View style={styles.centeredView}>
        <Modal
          animationType="slide"
          transparent={true}       
          onRequestClose={() => {
             self.props.showModal({isShow: false})
          }}
        >
          <View style={styles.modalView}>
            <Image 
              resizeMode="contain" 
              style={[styles.img,{ width: '100%', height: self.state.imgObjHg, top: - (self.state.imgObjHg * 0.28) }]}
              source={require('./../resources/images/updateVersion.png')}
            />
            <View style={styles.header}>
              <Text style={styles.title}>发现新版本!</Text>
              <Text style={styles.text}>{newVersion}版本,体验全新升级</Text>
            </View>
            <View style={[styles.content,{top: - (self.state.imgObjHg * 0.42)}]}>
              <Text style={styles.tip}>{newVersion}版本全新升级</Text>
              <Text style={styles.tip}>本次内容全面改版</Text>
              <TouchableHighlight
                style={styles.updateBtn}
                onPress={() => {
                  self.update();
                }}>
                <Text style={styles.updateTxt}>立即升级</Text>
              </TouchableHighlight>
              {
                showBack ? <TouchableHighlight
                  onPress={() => {
                    self.props.showModal({isShow: false})
                  }}>
                  <Text style={styles.backTxt}>跳过</Text>
                </TouchableHighlight>: null
              }
            </View>
          </View>
        </Modal>
      </View>
    );
  }
}

父组件

{
   this.state.isShow ? <VersionModal showModal={this.showModal.bind(this)} showBack={true} isShow={this.state.isShow} newVersion={this.state.newVersion} apkLink={this.state.apkLink}/> : null
}

样式自己写咯,不提供了

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值