Flutter异步加载的会引起的问题

简介: 在 Flutter 中,异步加载是非常常见的操作,例如从网络获取数据、读取本地文件等。然而,在使用异步加载时也会遇到一些坑点,如卡顿、内存泄漏等问题。以下是一些常见的异步加载坑点和优化方法

在 Flutter 中,异步加载是非常常见的操作,例如从网络获取数据、读取本地文件等。然而,在使用异步加载时也会遇到一些坑点,如卡顿、内存泄漏等问题。以下是一些常见的异步加载坑点和优化方法:

1. 坑点:过度依赖 FutureBuilder

FutureBuilder 是 Flutter 中非常方便的用于异步加载数据并更新 UI 的工具,但是如果在一个页面中使用大量的 FutureBuilder,会导致页面卡顿和资源浪费,甚至容易发生内存泄漏。

优化方法:将 FutureBuilder 拆分成更小的组件

将 FutureBuilder 拆分成更小的组件,每个组件只负责加载和显示自己的数据,可以降低页面复杂度,提高性能和可维护性。例如,可以将列表项拆分成单独的 Widget,并使用 ListView.builder 来构建列表视图,以避免创建大量的 FutureBuilder。

class MyWidget extends StatelessWidget {
  final Future<String> future;
  const MyWidget({Key? key, required this.future}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return FutureBuilder<String>(
      future: future,
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.done) {
          return Text(snapshot.data ?? '');
        } else {
          return CircularProgressIndicator();
        }
      },
    );
  }
}
class MyPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ListView.builder(
      itemCount: 10,
      itemBuilder: (context, index) {
        return MyWidget(
          future: _loadData(index),
        );
      },
    );
  }
  Future<String> _loadData(int index) async {
    await Future.delayed(Duration(seconds: 1));
    return 'Item $index';
  }
}

2. 坑点:内存泄漏

在使用异步加载时,如果没有正确管理资源和取消未完成的 Future,容易导致内存泄漏。

优化方法:使用 Stream 和取消 Future

使用 Stream 来替代 Future,可以更好地控制异步任务的生命周期,并通过 StreamSubscription 来取消未完成的任务。以下是一个示例代码:

class MyPage extends StatefulWidget {
  @override
  _MyPageState createState() => _MyPageState();
}
class _MyPageState extends State<MyPage> {
  StreamController<int> _controller = StreamController<int>();
  @override
  void dispose() {
    _controller.close();
    super.dispose();
  }
  @override
  Widget build(BuildContext context) {
    return StreamBuilder<int>(
      stream: _controller.stream,
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          return Text(snapshot.data!.toString());
        } else {
          return CircularProgressIndicator();
        }
      },
    );
  }
  void loadData() async {
    try {
      for (var i = 0; i < 10; i++) {
        await Future.delayed(Duration(seconds: 1));
        _controller.add(i);
      }
    } catch (e) {
      _controller.addError(e);
    }
  }
}

在上述代码中,使用 StreamController 和 StreamBuilder 来实现异步加载,并在 dispose 方法中关闭 StreamController。通过这种方式,可以更好地管理异步任务的生命周期,避免内存泄漏和资源浪费。

以上是对 Flutter 异步加载的坑点和优化方法的一些介绍,了解这些内容有助于开发者编写高效、可维护的 Flutter 应用程序。

相关文章
Flutter Getx 路由 until 方法帮助你跳转指定路由
不少同学都会问我,这样一个场景,当我点击商品列表,进入商品页,点击购买,支付成功后,想返回商品页,或者我的中心的订单列表。怎么做,这中间跨度了 n 个路由。 我不只一次的推荐 GetX 的 until 方法,和 offNamedUntil 方法。 我写了个 demo 今天我们就一起来看下这两个方法如何使用。
2471 0
Flutter Getx 路由 until 方法帮助你跳转指定路由
|
编解码 前端开发 JavaScript
React系列---React技术栈一览
React系列---React技术栈一览
2392 0
|
10月前
|
前端开发 Java 数据库
如何开发供应商管理系统中的招投标管理板块(附架构图+流程图+代码参考)
供应商管理系统中的招投标管理模块是企业提升采购效率、确保公平竞争的关键工具。文章详细介绍了该模块的功能设计、业务流程与开发技巧,涵盖需求创建、邀标、投标、评标、开标等核心环节,并提供系统架构、数据库设计及技术选型建议,助力企业构建高效、透明的招投标平台。
|
设计模式 开发者 UED
Flutter笔记:DefaultTextStyle和DefaultTextHeightBehavior解读
Flutter笔记:DefaultTextStyle和DefaultTextHeightBehavior解读
406 0
|
Web App开发 前端开发 JavaScript
技术心得记录:瀑布流的布局原理分析(纯CSS瀑布流与JS瀑布流)
技术心得记录:瀑布流的布局原理分析(纯CSS瀑布流与JS瀑布流)
534 0
|
新零售 架构师 Devops
如何衡量研发效能?阿里资深技术专家提出了5组指标
3月16日-17日,何勉老师将和阿里研发效能其他讲师一起在上海为我们分享《企业数字化转型面临的研发效能挑战—阿里DevOps体系和实践》课程,有关于阿里DevOps体系知识都可以从他们那里得到答案。
18776 116
|
存储 关系型数据库 MySQL
【MYSQL】 ——索引(B树B+树)、设计栈
索引的特点,使用场景,操作,底层结构,B树B+树,MYSQL设计栈
重识Flutter 用于解决复杂滑动视窗问题的Slivers - part1
在日常的开发工作中,仅仅使用ListView、ListView.builder等这样的滑动组件就能满足大部分的业务需求,但在碰到较为复杂的滑动页面时,我认为Slivers可以帮你更简单的实现。
重识Flutter  用于解决复杂滑动视窗问题的Slivers - part1
|
编解码 Dart UED
Flutter单线程异步及Isolate使用过程遇到的问题
Flutter单线程异步及Isolate使用过程遇到的问题 在Flutter中,所有的代码都运行在单线程中。这意味着如果我们的代码执行时间过长,就会导致UI线程卡顿,影响用户体验。因此,Flutter提供了一些异步机制来解决这个问题。
543 0

热门文章

最新文章