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

Flutter升级targetSdkVersion31后flutter_local_notifications报错求助

解决Flutter升级SDK31后通知PendingIntent报错问题

场景1:使用flutter_local_notifications插件

  • 先把插件升级到10.0.0及以上版本(新版本已适配SDK31+的PendingIntent要求)
  • 创建AndroidNotificationDetails时,显式指定pendingIntentMutability参数:
AndroidNotificationDetails androidNotificationDetails = AndroidNotificationDetails(
  'your_channel_id',
  'your_channel_name',
  channelDescription: 'your_channel_desc',
  // 其他配置...
  pendingIntentMutability: PendingIntentMutability.immutable, // 不需要修改Intent用这个
  // 若需动态修改Intent内容,改用PendingIntentMutability.mutable
);

// 然后用这个配置构建通知并显示
NotificationDetails notificationDetails = NotificationDetails(android: androidNotificationDetails);
await flutterLocalNotificationsPlugin.show(
  0,
  '通知标题',
  '通知内容',
  notificationDetails,
);

场景2:自定义原生通知(通过MethodChannel或原生代码实现)

核心是在创建PendingIntent时必须添加FLAG_IMMUTABLE或FLAG_MUTABLE标志,解决作用域问题的思路:

  • 把Intent的创建逻辑移到能生成PendingIntent的方法内部,或者通过参数传递Intent所需的跳转信息(比如目标Activity类名、参数),在原生方法内构建Intent后再生成带标志的PendingIntent:
// 示例:在MainActivity或自定义NotificationHelper类中
fun createNotificationPendingIntent(context: Context): PendingIntent {
    // 在这里构建Intent,避免作用域问题
    val intent = Intent(context, TargetActivity::class.java)
    intent.putExtra("key", "value") // 传递参数
    
    return PendingIntent.getActivity(
        context,
        0,
        intent,
        // 结合原有FLAG(比如FLAG_UPDATE_CURRENT)加上IMMUTABLE/MUTABLE
        PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
    )
}
  • 若Flutter端需要触发原生通知,通过MethodChannel传递必要参数,原生端接收后构建Intent和PendingIntent即可。

注意事项

  • 不需要动态修改Intent内容时,优先用FLAG_IMMUTABLE,安全性更高;
  • 若通知需要支持后续修改Intent参数(比如通知栏交互更新内容),则使用FLAG_MUTABLE。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 22:40:24