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

