升级flutter_local_notifications到9.1.1后调用zonedSchedule触发NullPointerException
问题触发原因
- 时区配置未初始化:flutter_local_notifications 9.0+版本的
zonedSchedule方法强制依赖timezone包的时区数据库能力,仅替换方法调用逻辑、未提前完成时区初始化操作时,原生层处理调度逻辑会出现异步流程异常,提前释放MethodChannel的Result回调对象,最终调用success方法时对象为空抛出空指针异常。 - 插件初始化未完成:调用
zonedSchedule前未完成插件全流程初始化、安卓端通知通道未提前注册、安卓13及以上版本未提前获取POST_NOTIFICATIONS权限,都会导致原生层处理调度请求时中途报错销毁回调对象,触发空指针。 - 时间参数不合法:传入的
tz.TZDateTime对象未绑定有效时区信息,比如tz.local未完成本地时区加载就被调用,原生层解析时间参数失败,也会导致回调提前释放触发异常。
对应解决方案
- 先在应用启动阶段完成时区初始化,示例代码如下:
import 'package:timezone/data/latest_all.dart' as tz; import 'package:timezone/timezone.dart' as tz; import 'package:flutter_native_timezone/flutter_native_timezone.dart'; // 在main函数runApp执行前调用该初始化逻辑 Future<void> initTimeZone() async { tz.initializeTimeZones(); final String timeZoneName = await FlutterNativeTimezone.getLocalTimezone(); tz.setLocalLocation(tz.getLocation(timeZoneName)); }
- 调用
zonedSchedule前确认插件已完成初始化,安卓端提前创建通知通道,安卓13及以上版本先申请通知权限,拿到授权结果后再调用调度方法。 - 调用方法前先打印校验生成的
TZDateTime对象,确认时间值与时区信息均合法后再传入参数。
内容的提问来源于stack exchange,提问作者Robin.S
相关产品推荐
相关产品推荐

