如何在Flutter中按条件使用flutter-hooks的useFuture,有更优方案吗?
你的现有实现逻辑是可行的,但存在两个隐性问题,且有更贴合hooks设计规范的优化方案:
- 如果你没有给
useMemoizedFuture传入selected.value作为依赖项,那么当selected值更新时,future不会重新计算,导致请求不会跟着选中内容更新,属于隐性bug - 空安全环境下
useState<int>(null)会报类型错误,需要将泛型改为可空类型int?
优化方案1:补充依赖项(最常用的轻量方案)
直接将selected.value作为依赖传入useMemoizedFuture的keys参数,只有当选中值变化时才会重新生成future实例,避免不必要的重复请求和无效计算:
final selected = useState<int?>(null); final future = useMemoizedFuture( () => selected.value != null ? http.get("someapi") : null, [selected.value], // 显式声明依赖,是触发future更新的唯一条件 );
优化方案2:支持手动刷新/重试的场景
如果你的业务需要支持手动重试、刷新请求,可以用useRefreshableFuture替代,除了自动跟随依赖更新外,还可以主动调用refresh方法触发重新请求:
final selected = useState<int?>(null); final refreshableFuture = useRefreshableFuture( () async { if (selected.value == null) return null; return http.get("someapi"); }, [selected.value], ); // 调用 refreshableFuture.refresh() 即可手动触发重新请求
两种方案都比原有写法更符合hooks的响应式设计原则,也避免了依赖遗漏导致的逻辑bug,你可以根据是否需要手动控制请求来选择对应的实现。
内容的提问来源于stack exchange,提问作者teslafan0
相关产品推荐
相关产品推荐

