在 React Native 中根据 Internet 连接状态显示按钮?
Display button based upon Internet connection status in React Native?
我对 React Native 还是有些陌生。我正在尝试检测用户的 Internet 连接状态并根据结果显示一个按钮。如果未检测到互联网连接,我想退出该应用程序。我的完整代码如下
import React from 'react'
import { Button, StyleSheet, Text, View } from 'react-native'
import { Actions } from 'react-native-router-flux'
import FlatContainer from './components/FlatContainer';
import NetInfo from "@react-native-community/netinfo";
const Welcome = () => {
NetInfo.fetch().then(state => {
console.log("Connection type", state.type);
console.log("Is connected?", state.isConnected);
var _connection = JSON.stringify(state.isConnected)
});
const goToHome = () => {
Actions.home()
}
return (
<View style={styles.page}>
<FlatContainer style={styles.container1}>
<Text>Welcome!</Text>
</FlatContainer>
<FlatContainer style={styles.container2}>
{_connection === "true" ? (
<View style={styles.button}>
<Button title='Button' color='blue' onPress={goToHome}/>
</View>
) : (
<View style={styles.button}>
<Button title='Exit' color='blue'/> //use 'BackHandler' here to exit?
</View>
)}
</FlatContainer>
<FlatContainer style={styles.container3}>
<Text>image</Text>
</FlatContainer>
</View>
)
}
const styles = StyleSheet.create({
page:{
flex:1,
paddingTop:50,
backgroundColor: 'black'
},
container1: {
backgroundColor: 'black',
height : 100
},
container2: {
backgroundColor: 'black',
height : 100
},
container3: {
backgroundColor: 'black',
height : 100
},
button:{
width:80,
height:40,
color: 'white',
backgroundColor: 'white'
}
});
export default Welcome
问题是虽然“NetInfo”似乎可以正常工作以确定 Internet 连接状态,但我似乎无法将该信息传输到变量(“_connection”)。该变量用于确定显示哪个按钮。 “_connection”似乎无法识别。
此外,我认为我需要导入“BackHandler”模块来编写代码以允许用户在按下正确的按钮后退出应用程序,但是我还没有编写那部分,因为我的代码由于以下原因而崩溃无法识别的变量。非常感谢任何建议。问候。
经过其他人的一些输入和一些研究后,我的代码如下,它看起来像这里写的那样有效:
const Welcome = () => {
const [isConnected, setIsConnected] = useState(false); //assume NO Internet connectivity...
const netInfo = useNetInfo();
useEffect(() => {
setIsConnected(netInfo.isConnected);
});
const goToHome = () => {
Actions.home()
}
const buttonToShowIfConnected = <Button title='Home' color='blue' onPress={goToHome}/>
const buttonToShowIfNotConnected = <Button title='Exit' color='blue' onPress={goToHome}/>
let conditionalButton = isConnected ? buttonToShowIfConnected : buttonToShowIfNotConnected
return (
<View style={styles.page}>
<FlatContainer style={styles.container1}>
<Text>Welcome</Text>
<Text>Type: {netInfo.type}</Text>
<Text>Is Connected? {netInfo.isConnected.toString()}</Text>
</FlatContainer>
<FlatContainer style={styles.container2}>
{conditionalButton}
</FlatContainer>
<FlatContainer style={styles.container3}>
<Text>image</Text>
</FlatContainer>
</View>
)
}
const styles = StyleSheet.create({
//stuff
}
我认为问题是 _connection
仅在 .then()
块内有作用域,因此当您尝试访问它时 在该块的 外部,在你的条件,它是未定义的。
我从未使用过 NetInfo
包,但像这样的东西可能有用:
const Welcome = () => {
// pass true or false to `useState` here depending on whether or not
// you want to assume the client is or isn't connected by default
const [isConnected, setIsConnected] = useState()
useEffect(() => {
NetInfo.fetch().then(state => {
setIsConnected(state.isConnected)
}
})
// skipping other code
const buttonToShowIfConnected = // your markup goes here
const buttonToShowIfNotConnected = // your markup goes here
let conditionalButton = isConnected ? buttonToShowIfConnected : buttonToShowIfNotConnected
return (
// markup before button
{conditionalButton}
// markup after button
)
}
这不是唯一的方法,但总的来说,我认为问题在于可变范围,并且可能没有完全理解 React 中的状态。
我认为您需要使用 useState() 声明一个变量并使用 useNetInfo() 来传输该变量。然后
const netInfo = useNetInfo()
useEffect(() => {
const unsubscribe = NetInfo.addEventListener((state) => {
setIsConnected(state.isConnected)
})
return (
() => unsubscribe()
)
}, [])
我对 React Native 还是有些陌生。我正在尝试检测用户的 Internet 连接状态并根据结果显示一个按钮。如果未检测到互联网连接,我想退出该应用程序。我的完整代码如下
import React from 'react'
import { Button, StyleSheet, Text, View } from 'react-native'
import { Actions } from 'react-native-router-flux'
import FlatContainer from './components/FlatContainer';
import NetInfo from "@react-native-community/netinfo";
const Welcome = () => {
NetInfo.fetch().then(state => {
console.log("Connection type", state.type);
console.log("Is connected?", state.isConnected);
var _connection = JSON.stringify(state.isConnected)
});
const goToHome = () => {
Actions.home()
}
return (
<View style={styles.page}>
<FlatContainer style={styles.container1}>
<Text>Welcome!</Text>
</FlatContainer>
<FlatContainer style={styles.container2}>
{_connection === "true" ? (
<View style={styles.button}>
<Button title='Button' color='blue' onPress={goToHome}/>
</View>
) : (
<View style={styles.button}>
<Button title='Exit' color='blue'/> //use 'BackHandler' here to exit?
</View>
)}
</FlatContainer>
<FlatContainer style={styles.container3}>
<Text>image</Text>
</FlatContainer>
</View>
)
}
const styles = StyleSheet.create({
page:{
flex:1,
paddingTop:50,
backgroundColor: 'black'
},
container1: {
backgroundColor: 'black',
height : 100
},
container2: {
backgroundColor: 'black',
height : 100
},
container3: {
backgroundColor: 'black',
height : 100
},
button:{
width:80,
height:40,
color: 'white',
backgroundColor: 'white'
}
});
export default Welcome
问题是虽然“NetInfo”似乎可以正常工作以确定 Internet 连接状态,但我似乎无法将该信息传输到变量(“_connection”)。该变量用于确定显示哪个按钮。 “_connection”似乎无法识别。
此外,我认为我需要导入“BackHandler”模块来编写代码以允许用户在按下正确的按钮后退出应用程序,但是我还没有编写那部分,因为我的代码由于以下原因而崩溃无法识别的变量。非常感谢任何建议。问候。
经过其他人的一些输入和一些研究后,我的代码如下,它看起来像这里写的那样有效:
const Welcome = () => {
const [isConnected, setIsConnected] = useState(false); //assume NO Internet connectivity...
const netInfo = useNetInfo();
useEffect(() => {
setIsConnected(netInfo.isConnected);
});
const goToHome = () => {
Actions.home()
}
const buttonToShowIfConnected = <Button title='Home' color='blue' onPress={goToHome}/>
const buttonToShowIfNotConnected = <Button title='Exit' color='blue' onPress={goToHome}/>
let conditionalButton = isConnected ? buttonToShowIfConnected : buttonToShowIfNotConnected
return (
<View style={styles.page}>
<FlatContainer style={styles.container1}>
<Text>Welcome</Text>
<Text>Type: {netInfo.type}</Text>
<Text>Is Connected? {netInfo.isConnected.toString()}</Text>
</FlatContainer>
<FlatContainer style={styles.container2}>
{conditionalButton}
</FlatContainer>
<FlatContainer style={styles.container3}>
<Text>image</Text>
</FlatContainer>
</View>
)
}
const styles = StyleSheet.create({
//stuff
}
我认为问题是 _connection
仅在 .then()
块内有作用域,因此当您尝试访问它时 在该块的 外部,在你的条件,它是未定义的。
我从未使用过 NetInfo
包,但像这样的东西可能有用:
const Welcome = () => {
// pass true or false to `useState` here depending on whether or not
// you want to assume the client is or isn't connected by default
const [isConnected, setIsConnected] = useState()
useEffect(() => {
NetInfo.fetch().then(state => {
setIsConnected(state.isConnected)
}
})
// skipping other code
const buttonToShowIfConnected = // your markup goes here
const buttonToShowIfNotConnected = // your markup goes here
let conditionalButton = isConnected ? buttonToShowIfConnected : buttonToShowIfNotConnected
return (
// markup before button
{conditionalButton}
// markup after button
)
}
这不是唯一的方法,但总的来说,我认为问题在于可变范围,并且可能没有完全理解 React 中的状态。
我认为您需要使用 useState() 声明一个变量并使用 useNetInfo() 来传输该变量。然后
const netInfo = useNetInfo()
useEffect(() => {
const unsubscribe = NetInfo.addEventListener((state) => {
setIsConnected(state.isConnected)
})
return (
() => unsubscribe()
)
}, [])