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

Flutter TimePicker报错:请勿跨异步间隙使用BuildContext

解决Flutter中TimePicker的BuildContext异步间隙警告

问题原因

这个警告是Dart的lint规则检测到你在异步操作(await showTimePicker)前后引用了BuildContext,而await期间Widget可能已经被销毁(比如用户退出当前页面),导致Context失效,引发潜在崩溃风险。你之前添加的if (!mounted) return;因位置不正确,没有覆盖到lint检测的风险点。

解决方案

方案1:正确使用mounted/context.mounted检查

如果代码在StatefulWidget的State类中,或使用Flutter 3.7+版本,可通过两次检查规避风险:

if (selectedDay == null) return;

// 异步操作前先检查Widget是否仍挂载
if (!mounted) return; // State类中使用;Flutter3.7+可替换为 !context.mounted

final timeOfDay = await showTimePicker(
  context: context,
  initialTime: TimeOfDay.fromDateTime(now.add(const Duration(minutes: 1))),
  builder: (BuildContext context, Widget? child) {
    // 此处context为局部变量,无跨异步间隙问题
    return Theme(
      data: ThemeData(
        colorScheme: const ColorScheme.light(primary: Colors.teal),
      ),
      child: child!,
    );
  },
);

// 异步操作后再次检查,避免操作已销毁的Widget
if (!mounted || timeOfDay == null) return;

// 不要直接return Widget,改为更新状态或导航实现逻辑
// 示例:更新状态
setState(() {
  // 将选中时间保存到状态变量
});

// 或示例:导航到目标页面
Navigator.push(
  context,
  MaterialPageRoute(
    builder: (_) => NotificationWeekAndTime(
      dayOfTheWeek: selectedDay!,
      timeOfDay: timeOfDay,
    ),
  ),
);

方案2:提前获取导航器(避免直接引用Context)

若不想依赖mounted检查,可提前获取Navigator实例,后续操作不再直接引用Context:

if (selectedDay == null) return;

// 提前获取Navigator实例
final navigator = Navigator.of(context);

final timeOfDay = await showTimePicker(
  context: context,
  initialTime: TimeOfDay.fromDateTime(now.add(const Duration(minutes: 1))),
  builder: (BuildContext context, Widget? child) {
    return Theme(
      data: ThemeData(
        colorScheme: const ColorScheme.light(primary: Colors.teal),
      ),
      child: child!,
    );
  },
);

if (timeOfDay == null) return;

// 使用提前获取的navigator执行导航
navigator.push(
  MaterialPageRoute(
    builder: (_) => NotificationWeekAndTime(
      dayOfTheWeek: selectedDay!,
      timeOfDay: timeOfDay,
    ),
  ),
);

关键提示

  • 你之前直接return NotificationWeekAndTime的写法不符合常见场景(比如onPressed这类void回调中return无意义),应改为更新状态或导航操作。
  • showTimePicker的builder参数里的局部Context不存在跨异步间隙问题,lint警告的是外部传入的Context。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 13:47:40