You need to enable JavaScript to run this app. Flutter使用sleep函数实现计数功能时点击按钮后应用卡顿无响应
优惠活动
大模型
产品
解决方案
定价
更多

Flutter使用sleep函数实现计数功能时点击按钮后应用卡顿无响应

卡顿问题核心成因
  • Flutter 的 UI 事件响应、界面渲染逻辑全部运行在根Isolate(对应平台主线程)上,事件循环需要持续处理触摸交互、帧绘制等任务,一旦被同步阻塞就会出现界面无响应、卡顿掉帧的问题。
  • 代码中使用的sleep(Duration(seconds: 1))是同步阻塞方法,调用后会直接挂起当前Isolate的所有任务执行。点击按钮触发looping()方法后,主线程会被连续阻塞100秒,既无法响应用户的后续操作,也无法完成setState触发的界面重绘,最终表现为应用点击后立刻失去响应。
代码调整方案

调整核心思路是移除所有会阻塞主线程的同步等待逻辑,替换为非阻塞的异步实现,保证主线程可以持续运行事件循环、处理UI任务,具体修改点:

  • 将looping方法改造为支持异步执行的async方法
  • 用非阻塞的Future.delayed()替换原有的同步sleep,配合await实现逐秒等待逻辑

修改后的完整代码如下:

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  Future<void> looping() async {
    for (int i = 0; i < 100; i++) {
      setState(() {
        counter++;
      });
      // 原同步sleep替换为非阻塞的异步延时
      await Future.delayed(Duration(seconds: 1));
    }
  }

  int counter = 0;
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        backgroundColor: Colors.white,
        floatingActionButton: FloatingActionButton(
          child: Icon(Icons.add),
          onPressed: () {
            looping();
          },
        ),
        body: Center(
          child: Text(counter.toString(),
              style: TextStyle(fontSize: 50.0, fontWeight: FontWeight.bold)),
        ),
      ),
    );
  }
}

改造后,每次执行await Future.delayed()时,当前计数逻辑会被暂时挂起,执行权交还给Flutter事件循环,可正常处理触摸交互、界面渲染任务;每间隔1秒会自动回到计数流程中,完成counter自增和UI更新,既实现了逐秒计数的预期功能,也不会出现应用卡死的问题。

内容的提问来源于stack exchange,提问作者user14943711

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.30 20:27:02