Flutter中Future加载网络数据的频次是多少?跳转页面返回后是否会重新加载
Flutter Future 网络请求频次规则说明
pop返回页面A是否会重新触发请求
这个行为没有固定答案,完全由你初始化Future的时机决定,分为两种常见场景:
会重新发起请求的场景
如果你直接将异步请求逻辑写在FutureBuilder的future参数中,每次页面触发build就会生成新的Future实例,就会重发请求:
@override Widget build(BuildContext context) { return Scaffold( // 错误写法:每次build都会创建新的Future实例 body: FutureBuilder<Response>( future: http.get(Uri.parse("https://your-api.com/data")), builder: (context, snapshot) { // 页面渲染逻辑 }, ) ); }
跳转页面B再pop回页面A时,页面A会重新执行build方法,新的Future实例会重新发起网络请求。除了pop返回场景,父组件重绘、状态更新、系统配置变化等所有触发build的场景,都会导致请求重复执行。
不会重新发起请求的场景
如果你将Future实例存在State中,在initState生命周期里仅初始化一次,就不会重复请求:
class PageAState extends State<PageA> { late Future<Response> _dataFuture; @override void initState() { super.initState(); // 仅在State首次初始化时执行一次请求 _dataFuture = http.get(Uri.parse("https://your-api.com/data")); } @override Widget build(BuildContext context) { return Scaffold( // 复用同一个Future实例 body: FutureBuilder<Response>( future: _dataFuture, builder: (context, snapshot) { // 页面渲染逻辑 }, ) ); } }
常规push跳转页面B再pop回A时,页面A的State不会被销毁,已经初始化的_dataFuture实例会被复用,不会重新发起请求,会直接返回之前已经缓存的请求结果。
注意:如果页面A被主动销毁(比如执行pop退出页面A、用pushReplacement替换页面A),再次进入页面A时会重新创建State,还是会重新初始化Future发起请求。
Future 加载数据通用频次规则
- 单个Future实例仅执行一次异步逻辑:Future一旦被触发执行,后续不管多少次监听它的状态,都只会返回首次执行的缓存结果,不会重复跑异步逻辑。
- 请求是否重复只和Future实例是否更新有关:只要每次调用逻辑时生成新的Future实例,就会触发新的请求;复用旧实例就不会重复执行。
- State的生命周期决定Future的存活周期:存储在State中的Future实例会和State绑定,State未销毁就会一直存在,State销毁后下次进入会重新创建新的Future实例。
内容的提问来源于stack exchange,提问作者Bright
相关产品推荐
相关产品推荐

