Flutter使用just_audio时触发connectivity插件MissingPluginException问题排查
问题分析:Flutter点击播放按钮触发MissingPluginException异常
问题场景
集成just_audio的Flutter组件中,点击播放按钮时抛出异常,错误核心为connectivity插件的check方法无对应实现。
实现代码
// ignore_for_file: library_private_types_in_public_api, avoid_print import 'package:connectivity/connectivity.dart'; import 'package:flutter/material.dart'; import 'package:just_audio/just_audio.dart'; import 'package:fluttertoast/fluttertoast.dart'; class HymnTune extends StatefulWidget { final String hymnMusicPath; const HymnTune({super.key, required this.hymnMusicPath}); @override _HymnTuneState createState() => _HymnTuneState(); } class _HymnTuneState extends State<HymnTune> with SingleTickerProviderStateMixin { late AnimationController iconController; bool isPlaying = false; double iconSize = 30.0; final AudioPlayer hymnTunePlayer = AudioPlayer(); @override void initState() { super.initState(); iconController = AnimationController( vsync: this, duration: const Duration(milliseconds: 100), ); loadMusic(); } Future<void> loadMusic() async { if (widget.hymnMusicPath.isNotEmpty) { try { await hymnTunePlayer.setAudioSource(AudioSource.uri(Uri.parse(widget.hymnMusicPath))); } catch (e) { Fluttertoast.showToast( msg: "Error loading audio source: $e", textColor: Colors.white, backgroundColor: Colors.black45, toastLength: Toast.LENGTH_LONG, gravity: ToastGravity.BOTTOM, ); } } } Future<bool> checkInternetConnection() async { var connectivityResult = await Connectivity().checkConnectivity(); return connectivityResult != ConnectivityResult.none; } void showNoInternetToast() { Fluttertoast.showToast( msg: 'No Internet Connection', textColor: Colors.white, backgroundColor: Colors.black45, toastLength: Toast.LENGTH_SHORT, gravity: ToastGravity.BOTTOM, ); } @override Widget build(BuildContext context) { return GestureDetector( onTap: () => animateIcon(), child: AnimatedIcon( icon: AnimatedIcons.play_pause, progress: iconController, size: iconSize, ), ); } void animateIcon() async { if (widget.hymnMusicPath.isNotEmpty) { bool isConnected = await checkInternetConnection(); if (!isConnected) { showNoInternetToast(); return; } setState(() { isPlaying = !isPlaying; }); if (isPlaying) { await iconController.forward(); await hymnTunePlayer.play(); } else { await iconController.reverse(); await hymnTunePlayer.pause(); } } } @override void dispose() { hymnTunePlayer.dispose(); iconController.dispose(); super.dispose(); } }
错误日志
E/flutter ( 7782): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: MissingPluginException(No implementation found for method check on channel plugins.flutter.io/connectivity) E/flutter ( 7782): #0 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:332:7) E/flutter ( 7782): E/flutter ( 7782): #1 MethodChannelConnectivity.checkConnectivity (package:connectivity_platform_interface/src/method_channel_connectivity.dart:41:9) E/flutter ( 7782): E/flutter ( 7782): #2 _HymnTuneState.checkInternetConnection (package:disciples_hymn/screens/hymn_tune.dart:49:30) E/flutter ( 7782): E/flutter ( 7782): #3 _HymnTuneState.animateIcon (package:disciples_hymn/screens/hymn_tune.dart:77:26) E/flutter ( 7782): E/flutter ( 7782):
问题原因
这个异常和just_audio无关,是connectivity插件的原生平台实现未正确注册导致的。Flutter插件需要Android/iOS原生端的代码支持,当插件安装不完整、项目未重新构建,或者插件版本与Flutter版本不兼容时,就会出现MissingPluginException,提示找不到对应方法的实现。
解决方法
- 重新构建项目:停止当前运行的应用,执行
flutter clean清理缓存,flutter pub get重新获取依赖,再用flutter run重启项目。 - 检查插件安装完整性:确认
pubspec.yaml中connectivity依赖已正确添加且版本适配;Android端进入android目录执行./gradlew clean后重构;iOS端进入ios目录执行pod install确保Pod依赖安装完成。 - 替换为稳定替代插件:如果
connectivity仍有问题,可改用官方推荐的connectivity_plus。替换pubspec.yaml中的依赖为connectivity_plus: ^最新版本,代码中替换导入和方法调用后重新构建。
内容的提问来源于stack exchange,提问作者Igwe Ugochukwu
相关产品推荐
相关产品推荐

