首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让NetInfo与expo-web协同工作?

如何让NetInfo与expo-web协同工作?
EN

Stack Overflow用户
提问于 2020-04-29 00:04:56
回答 1查看 663关注 0票数 0

我尝试使用expo文档中的NetInfo示例:https://docs.expo.io/versions/latest/sdk/netinfo/

当我为web编译时,编译失败,出现以下错误:

代码语言:javascript
复制
TypeError: NetInfo.addEventListener is not a function
(anonymous function)
..components/OfflineFullScreen.jsx:22

  21 | 
> 22 |    const unsubscribe = NetInfo.addEventListener((state) => {
     | ^  23 |      console.log('Connection type', state.type);
  24 |      console.log('Is connected?', state.isConnected);
  25 |    });

即使文档声明它应该被支持。

我的屏幕看起来是这样的:

代码语言:javascript
复制
import React, { useEffect, useState } from 'react';
import {
  View, Text, StyleSheet, ActivityIndicator,
} from 'react-native';
// import NetInfo from '@react-native-community/netinfo';
import * as NetInfo from '@react-native-community/netinfo';

const OfflineNotice = () => {
  const [connected, setConnected] = useState(true);


  useEffect(() => {

    /* const unsubscribe = NetInfo.addEventListener((state) => {
      if (state.isConnected) {
        setConnected(true);
      } else {
        setConnected(false);
      }
    }); */

    const unsubscribe = NetInfo.addEventListener((state) => {
      console.log('Connection type', state.type);
      console.log('Is connected?', state.isConnected);
    });

    return unsubscribe();
  }, []);

  if (!connected) { // if not connected return an full sized overlay
    return (
      <View style={styles.offlineContainer}>
        <ActivityIndicator size="large" color="darkorange" />
        <Text style={styles.offlineText}>No Internet Connection</Text>
        <Text style={styles.offlineText}>Trying to reconnect ...</Text>
      </View>
    );
  }
  return null;
};

const styles = StyleSheet.create({
  offlineContainer: {
    alignItems: 'center',
    justifyContent: 'center',
    position: 'absolute',
    position: 'absolute',
    left: 0,
    top: 0,
    opacity: 0.85,
    backgroundColor: 'black',
    width: '100%',
    height: '100%',
    zIndex: 100,
  },
  offlineText: {
    color: '#fff',
    marginTop: '3%',
  },
});

export default OfflineNotice;

你知道我做错了什么吗?这可能是个bug,因为expo-web还处于测试阶段?

我使用的是Expo SDK 37,@react-native-community/netinfo@4.6.0,

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-06 00:45:01

在React Native Web中,使用的是过时的Netinfo版本。这可以通过添加一个类似下面的代码的polyfill来解决。

代码语言:javascript
复制
import { useEffect, useState, useCallback } from 'react';
import { Platform } from 'react-native';
import NetInfo from 'react-native-web/dist/exports/NetInfo';

function useOldNetInfo() {
  const [netInfo, setNetInfo] = useState<NetInfo.NetInfoState>({});
  const [isConnected, setIsConnected] = useState<boolean>(true);

  const onInfo = useCallback((data) => {
    setNetInfo({ ...data, isConnected });
  }, [isConnected]);

  useEffect(() => {
    NetInfo.getConnectionInfo().then(onInfo);
    NetInfo.isConnected.fetch().then(setIsConnected);
    return NetInfo.addEventListener('connectionChange', onInfo).remove;
  }, [onInfo]);

  return netInfo;
}

export default Platform.select({
  web: useOldNetInfo,
  ios: CommunityNetInfo.useNetInfo,
  android: CommunityNetInfo.useNetInfo,
});

Github问题:https://github.com/expo/expo/issues/8070

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61484674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档