Skip to content

Flutter防止网络造成阻塞

网络的阻塞,不仅影响用户体验,还会影响应用的稳定性。因为Flutter是单线程的,所以在大量的网络请求导致整个线程阻塞,也不是不可能。如何避免网络造成阻塞,也是本期优化重要的话题。

异步

请求的异步,不仅包含异步发起网络请求(Future),还有异步渲染UI。异步发起网络请求很简单,就是在函数中使用async/await关键字,异步执行请求,带异步执行完成后再渲染UI。使用现代化的请求工具类如DIO,当你发起请求时,会得到一个异步Future对象,当请求完成时,会回调一个回调函数,在回调函数中,你可以渲染UI。

dart
import 'package:dio/dio.dart';

final dio = Dio();

void getHttp() async {
  final response = await dio.get('https://dart.dev');
  print(response);
}

可是,异步请求并不能100%保证UI渲染不会受到影响,所以在考虑网络异步的同时,还要考虑组件的异步渲染,所以Flutter早就想到了这个问题,使用FutureBuilder组件,当Future对象完成时,FutureBuilder会回调一个回调函数,在回调函数中,你可以渲染UI,他会告诉你Future执行时的结果,以及是否发生错误。我们在组件,FutureBuilder一篇中,进行详细讲解。

StatefulWidget中的进一步优化

有时候,你不得不避免在组件中发起网络请求,那么,如何优化呢?StatefulWidget组件中一般触发请求的生命周期在initState()中,所以,你可以在initState()中发起请求,也吧请求放在Future中执行,简单来说就是按照下面的示例修改代码:

dart
class _MyWidgetState extends State<MyWidget> {
  @override
  void initState() async {
    await getArticle();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return const Placeholder();
  }

  Future<void> getArticle() async {}
}

将代码修改为

dart
@override
void initState() {
  Future(()async{
    await getArticle();
  });
  super.initState();
}

不费吹灰之力,你的页面将在路由激活组件时,流畅过度,而不因为请求执行导致掉帧。
接下来一篇文章,我们要讲解适时取消请求,这将避免很大一部分的无效请求造成阻塞。

仅用于培训和测试,通过使用本站代码内容随之而来的风险与本站无关。版权所有,未经授权请勿转载,保留一切权利。
ICP备案号:滇ICP备15009214号-13   公安网备:滇公网安备 53312302000061号