You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何消除Flutter中“Don’t use BuildContext across async gaps”警告

问题分析与解决方案

你遇到的问题核心是异步操作执行期间Widget可能已经被卸载,但你只在最后跳转前检查了mounted,前面的异步步骤完成后没有及时终止流程,加上Flare动画的回调可能在Widget卸载后仍触发,导致即使最后有mounted判断,静态分析或运行时仍可能出现警告。

具体修复步骤

  1. 在Flare回调中提前拦截:动画结束的回调可能在Widget已卸载时执行,先检查挂载状态再执行异步任务。
  2. 每个异步操作后检查挂载状态:在每一步异步请求完成后,都判断Widget是否还挂载,若已卸载直接返回,避免后续无效操作。
  3. 使用context.mounted替代State的mounted(Flutter 2.12+):让静态分析更精准识别上下文有效性,减少不必要的lint警告。

修改后的完整代码

import 'package:agil_app/Helpers/notification_helper.dart';
import 'package:agil_app/constants/size_config.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flare_flutter/flare_actor.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:agil_app/Module/Localizacao/localizacao_notifier.dart';

class IntroAgil extends StatefulWidget {
  const IntroAgil({Key? key}) : super(key: key);

  @override
  State<IntroAgil> createState() => _IntroAgilState();
}

class _IntroAgilState extends State<IntroAgil> {
  bool geoPermission = false;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SingleChildScrollView(
        child: Column(
          children: [
            Center(
              child: SizedBox(
                width: SizeConfig.widthMultiplier * 100,
                height: SizeConfig.heightMultiplier * 100,
                child: FlareActor(
                  "assets/flr/IntroAgil.flr",
                  fit: BoxFit.cover,
                  animation: "IntroAgil",
                  callback: (callback) async {
                    // 动画回调先检查是否已挂载
                    if (!context.mounted) return;
                    await handleAsyncTasks();
                  },
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }

  Future<void> handleAsyncTasks() async {
    await FirebaseMessaging.instance.getInitialMessage().then(handleMessage);
    // 异步操作后检查挂载状态
    if (!context.mounted) return;

    geoPermission = await Provider.of<LocalizacaoNotifier>(context, listen: false)
        .permissionLocator();
    if (!context.mounted) return;

    if (!geoPermission) {
      geoPermission = await Provider.of<LocalizacaoNotifier>(context, listen: false)
          .requestPermission();
      if (!context.mounted) return;
    }

    // 此时确认上下文有效,直接执行跳转
    Navigator.of(context)
        .pushNamedAndRemoveUntil('/home', (Route<dynamic> route) => false);
  }
}

额外说明

如果你的Flutter版本低于2.12,无法使用context.mounted,可以替换回mounted,但要确保每一步异步后都检查。另外,handleMessage方法如果涉及上下文操作,也需要添加对应的挂载检查,避免同样的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 23:47:14