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
相关产品推荐
相关产品推荐

