Android WebView 中 React useState 更新失效问题

1. 问题

在 Android App 内嵌的 H5 页面(React)中:

  • 打开文件选择器上传图片后,页面所有 useState 的更新(如 setLoadingsetRecordList)都不生效
  • 接口返回数据正常,但页面不渲染
  • 原生 DOM 操作正常
  • 使用 Zustand/Redux/Context 管理状态时正常
  • iOS 正常

2. 问题原因

Android WebView 的底层渲染 Bug

  • 触发条件:打开文件选择器(<input type="file">)后返回页面
  • WebView 在 onPause()onResume() 后,渲染引擎进入异常状态
  • 组件内部的 useState 更新被无限期挂起,无法提交到 DOM
  • Context/Redux/Zustand 走的是独立的订阅-通知机制,绕过了这个问题
更新方式 是否失效
useState / useReducer ❌ 失效
Context / Zustand / Redux ✅ 正常
原生 DOM 操作 ✅ 正常

3. 解决方案

将组件本地状态迁移到全局状态管理库

使用 Zustand 示例

javascript 复制代码
import { useEffect, useRef, useState, useContext } from 'react';
import { APP_CONTEXT } from '@/server/store';

export default function App({}) {
  // const [recordList, setRecordList] = useState([]);
   const {
        state: { recordList },
        dispatch,
    } = useContext(APP_CONTEXT);
}
 const getFirstPageData = async () => {
        // 请求第一页数据
        setLoading(true);
        const res = await getGrowthRecordListApi();
        // setRecordList(res.list);
        dispatch({ recordList: res.list });
        setLoading(false);
    };
 }
相关推荐
ayqy贾杰几秒前
过去三年我做对了一件事
前端·面试·ai编程
liu_sir_6 分钟前
安卓设置界面-关于手机修改为关于设备
android·大数据·elasticsearch
Hello--_--World13 分钟前
React:useRef 超详细教程、forwardRef 详解、useImperativeHandle详解
前端·javascript·react.js
xuankuxiaoyao18 分钟前
vue.js 课程自己编写小游戏
前端·javascript·vue.js
new_bie_B19 分钟前
Android16 应用安装流程源码分析
android
兔子零102420 分钟前
当 Codex 成为主力,软件工程的重心已经变了
前端·后端·架构
帅次22 分钟前
LazyColumn 懒加载、items 与 key
android·flutter·kotlin·android studio·webview
zhangphil24 分钟前
Android显示系统RenderThread绘制HARDWARE/普通格式Bitmap与GPU与CPU处理机制
android
牛奶31 分钟前
网关是怎么当"门卫"的?
前端·后端·负载均衡
上海合宙LuatOS35 分钟前
合宙TCP/UDP web测试工具简介
前端·物联网·tcp/ip·udp·luatos