You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 00:36:01