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

Flutter Redux结合Hook时如何像React一样在useEffect监听Reducer状态变量变更

问题根因

  • 你直接通过StoreProvider.of(context).state.balanceState.count取值时,默认没有开启状态监听,Redux store中count更新时不会触发当前HookWidget重绘,build方法里的count变量永远是首次初始化的值,所以useEffect的依赖项没有变化,自然只会执行一次。
  • 按钮点击的传参逻辑有误:你使用count++后自增运算符,dispatch给action的是自增前的旧值,即使后续重绘也可能出现值更新异常。

修复方案

方案1(推荐):使用useSelector订阅状态

如果你引入了flutter_redux_hooks依赖,直接用useSelector来订阅你需要的count值,它会自动监听状态变化,仅当count更新时触发对应逻辑,性能更好。
把build方法中count的取值逻辑替换为:

final count = useSelector<AppState, int>((state) => state.balanceState.count);

方案2:给StoreProvider取值开启监听

如果你不想引入额外hook,直接在取值时加上listen: true参数,这样store更新时会触发整个widget重绘,count值也会同步更新:

int count = StoreProvider.of<AppState>(context, listen: true).state.balanceState.count;

修复按钮点击逻辑

把按钮的onPressed里的传参改为count + 1,避免后自增导致的传值错误:

onPressed: (){
  StoreProvider.of<AppState>(context).dispatch(SetCountAction(count + 1));
}

原理解释

你之前用useState能正常触发useEffect,是因为useState更新时会主动触发当前widget重绘,依赖项的值会同步更新,自然会触发useEffect执行。而Redux默认的取值方式不会主动触发重绘,所以需要主动开启监听或者使用专门的订阅hook。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:39:03