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

Dart全局函数如何使用已更新的全局变量值?

Dart中AndroidAlarmManager延迟调用全局函数无法获取更新后变量值的解决方案

问题原因

AndroidAlarmManager的oneShotAt方法在Android平台会创建一个**独立的Isolate(隔离区)**执行目标函数。全局变量的作用域仅限于当前Isolate,你在主Isolate里更新的全局变量,在Alarm触发时的新Isolate中是完全独立的副本,所以会使用初始值。


方案1:直接通过AlarmManager传递参数(推荐)

AndroidAlarmManager.oneShotAt支持调用时传递参数,把需要的Date和Hour直接传给fireAlarm,彻底避免依赖全局变量。

修正后的代码:

// 先修正原代码的类型错误:Hour是int类型,不能赋值字符串
void setAlarm() async{
  String newDate = '2028-12-12';
  int newHour = 13;
  // 把需要的值作为参数传入,注意参数需支持JSON序列化
  await alarm.AndroidAlarmManager.oneShotAt(alarmTime, 1, fireAlarm,
      arguments: {'date': newDate, 'hour': newHour});
}

// 修改fireAlarm接收参数
void fireAlarm(){
  // 从AlarmManager的参数中获取值
  final args = alarm.AlarmManagerArguments.fromArgs();
  print(args['date']); // 输出2028-12-12
  print(args['hour']); // 输出13
}

注意:传递的参数必须是可JSON序列化的类型(如String、int、bool等),复杂对象需先序列化。


方案2:用SharedPreferences持久化变量

如果需要全局共享状态,可以把变量存入SharedPreferences,fireAlarm执行时主动读取最新值。

代码示例:

import 'package:shared_preferences/shared_preferences.dart';

void setAlarm() async{
  String newDate = '2028-12-12';
  int newHour = 13;
  // 保存到SharedPreferences
  final prefs = await SharedPreferences.getInstance();
  await prefs.setString('alarm_date', newDate);
  await prefs.setInt('alarm_hour', newHour);
  
  await alarm.AndroidAlarmManager.oneShotAt(alarmTime, 1, fireAlarm);
}

void fireAlarm() async{
  // 从SharedPreferences读取最新值
  final prefs = await SharedPreferences.getInstance();
  String date = prefs.getString('alarm_date') ?? '2022-08-12';
  int hour = prefs.getInt('alarm_hour') ?? 0;
  print(date);
  print(hour);
}

额外注意

原代码存在类型错误:Hour是int类型,但你在setAlarm里赋值成了字符串'13',这会导致编译错误,必须改成int类型的13。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:36:23