使用React Native、Expo、React Native Paper调用API的方式是否正确?
问题排查&修复方案
- API地址配置错误,这是触发网络错误的核心原因
你当前使用的const API_ENDPOINT = 'https://localhost:5001/api/Medicines/'中的localhost在手机/模拟器环境指向的是运行RN应用的设备本身,不是启动后端服务的电脑,必然请求不通。
修复方法:把localhost替换为电脑在局域网内的IP地址,例如电脑IP为192.168.3.4,就修改为https://192.168.3.4:5001/api/Medicines/,同时保证手机/模拟器和电脑处于同一WiFi网络,后端服务开放了局域网访问权限、没有被防火墙拦截。
补充说明:安卓模拟器可以用特殊IP10.0.2.2指向电脑的localhost,iOS模拟器直接使用电脑的局域网IP即可。 - 缺少HTTP安全策略配置
若你的后端使用的是HTTP而非HTTPS,iOS和安卓新版本默认会拦截明文HTTP请求,你可以给后端配置HTTPS证书,或者分别配置平台的明文请求权限:
安卓端:在android/app/src/main/AndroidManifest.xml的application标签中添加android:usesCleartextTraffic="true"
iOS端:在info.plist中添加NSAppTransportSecurity配置,将NSAllowsArbitraryLoads设为true - 请求逻辑完整性缺失
原生fetch方法仅在网络层面失败时才会进入catch分支,接口返回404/500这类HTTP业务错误不会触发catch,你需要增加状态码判断逻辑,同时添加错误打印方便定位具体问题:useEffect(() => { // 发起请求前设置loading状态为true setIsLoading(true) fetch(API_ENDPOINT) .then(response => { if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`) } return response.json() }) .then(results => { setData(results); }) .catch(err => { // 打印错误详情,可在控制台查看具体报错信息 console.log('请求报错详情:', err) setError(err); }) .finally(() => { // 请求结束后关闭loading状态 setIsLoading(false) }) }, []); - 渲染逻辑存在潜在报错
FlatList的renderItem中你写的是${item.name.id},如果接口返回的item里name字段是字符串而非对象,这里会直接抛出渲染错误导致页面空白,可以先修改为{item.name || '无名称'}做兼容测试。 - 布局配置错误
最外层的View没有添加flex:1样式,会导致FlatList内容无法撑开显示,哪怕数据请求成功也看不到内容,修改为<View style={{flex:1}}>即可。 - 补充注意:你的
isLoading状态需要按上面的请求逻辑正确设置,否则会出现状态显示异常。
内容的提问来源于stack exchange,提问作者Moya
相关产品推荐
相关产品推荐

