Flutter使用android_alarm_manager_plus回调时触发assets_audio_player MissingPluginException
报错根因
该报错核心源于android_alarm_manager_plus的回调函数运行在独立的Dart Isolate环境中,此环境未继承主Isolate的原生插件通道注册信息,因此调用assets_audio_player的原生交互方法时无法找到对应实现,触发MissingPluginException。
修复步骤
- 步骤1:在报警回调函数开头手动完成插件注册
在回调函数内先初始化Flutter绑定,再调用自动生成的插件注册类,将所有原生插件注册到当前Isolate即可。 - 步骤2:补充Android端权限配置(针对Android 12及以上系统)
在android/app/src/main/AndroidManifest.xml的manifest标签下添加精确闹钟权限:<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" /> - 步骤3:清理缓存重新构建
依次执行以下命令清除历史构建缓存,再重新安装应用:flutter clean flutter pub get
修复后完整代码示例
import 'package:android_alarm_manager_plus/android_alarm_manager_plus.dart'; import 'package:assets_audio_player/assets_audio_player.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; // 导入自动生成的插件注册类,Flutter编译时自动生成无需手动创建 import 'generated_plugin_registrant.dart'; void printHello() async{ // 新增:初始化当前Isolate的Flutter绑定 WidgetsFlutterBinding.ensureInitialized(); // 新增:注册所有原生插件到当前Isolate GeneratedPluginRegistrant.registerWith(WidgetsFlutterBinding.instance); final DateTime now = DateTime.now(); print("[$now] Hello, world! function='$printHello'"); ///play audio AssetsAudioPlayer assetsAudioPlayer = AssetsAudioPlayer.withId("App_ID"); var audio = Audio( "assets/audios/music.mp3", ); assetsAudioPlayer.open(audio, autoStart: true, showNotification: true, ); } main() async { WidgetsFlutterBinding.ensureInitialized(); await AndroidAlarmManager.initialize(); runApp(MyApp()); await AndroidAlarmManager.oneShotAt(DateTime.now().add(Duration(seconds: 15)), 123456789, printHello); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Welcome to Flutter', home: Scaffold( appBar: AppBar( title: const Text('Welcome to Flutter'), ), body: const Center( child: Text('Hello World'), ), ), ); } }
内容的提问来源于stack exchange,提问作者Sajjad
相关产品推荐
相关产品推荐

