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

Expo构建的APP打包成功后扫码触发崩溃重启问题求助

扫码页面打包APK后崩溃修复方案

核心诱因:开发环境内置未捕获异常拦截机制,报错仅展示红屏不会触发应用崩溃;打包为生产APK后,未被捕获的运行时异常会直接导致应用闪退重启。你的代码存在以下可直接触发崩溃的问题,按优先级调整即可:

  • 核心问题:handleBarCodeScanned 回调中的两个fetch请求都没有添加错误捕获逻辑,生产环境下如果出现网络波动、接口返回非JSON格式、接口报错等场景,调用response.json()会抛出未捕获的Promise异常,直接触发闪退。
  • 潜在问题1:setScanned(true) 状态更新是异步操作,旧代码中状态更新还未生效就发起网络请求,可能偶发重复触发扫码回调的问题。
  • 潜在问题2:Picker组件渲染时< Picker.Item 标签名前多了一个空格,生产环境编译优化时可能出现语法解析异常。
  • 潜在问题3:username 取值未做非空判断,如果employeeNameDetails()返回空值,接口传参异常也可能引发报错。

具体修改代码

1. 调整handleBarCodeScanned逻辑,添加错误捕获

const handleBarCodeScanned = ({ data }) => {
  // 先禁用扫码回调,避免重复触发
  setScanned(true);
  setData(data);
  
  // 先校验username非空
  if (!username) {
    Alert.alert("错误", "用户信息获取失败,请重试");
    return;
  }

  // 搜索物品接口添加catch
  const searchAPI = "https://example.com/api/searchitembyid.php";
  const header = {
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  };
  const itemdata = { itemid: data };
  fetch(searchAPI, {
    method: 'POST',
    headers: header,
    body: JSON.stringify(itemdata)
  })
  .then((response)=>response.json())
  .then((responseJSON)=>{
    setItemData(responseJSON)
  })
  // 新增错误捕获
  .catch((err) => {
    console.error('搜索物品接口报错', err);
    Alert.alert('提示', '物品信息获取失败,请重试');
  });

  // 获取房间接口添加catch
  const roomAPI = "https://example.com/api/getroom.php";
  const roomheader = {
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  };
  const roomdata = { username: username };
  fetch(roomAPI, {
    method: 'POST',
    headers: roomheader,
    body: JSON.stringify(roomdata)
  })
  .then((response)=>response.json())
  .then((responseJSON)=>{
    setRoomName(responseJSON)
  })
  // 新增错误捕获
  .catch((err) => {
    console.error('获取房间接口报错', err);
    Alert.alert('提示', '房间信息获取失败,请重试');
  });
};

2. 修正Picker标签多余空格

<Picker
  selectedValue={room}
  style={styles.pickerInput}
  onValueChange={(itemValue, itemIndex) => setRoom(itemValue)}>
  {roomName.map((item, index) => {
    // 去掉标签前的多余空格
    return (<Picker.Item label={item.roomname} value={item.roomname} key={index} />);
  })}
</Picker>

预验证建议

修改完成后可以先运行生产模式本地调试,无需打包APK即可复现生产环境的报错:
npx expo start --no-dev --minify
如果运行后扫码不再崩溃,再打包APK即可。

内容的提问来源于stack exchange,提问作者fahmijaafar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 10:06:03