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
相关产品推荐
相关产品推荐

