handleMethodCall method
Implementation
Future<dynamic> handleMethodCall(MethodCall call) async {
final Map<String, dynamic> arguments = _argumentsOf(call.arguments);
final playerId = arguments['playerId'] ?? "0";
final player = getOrCreatePlayer(playerId);
player.onEvent = (method, args) {
_channel?.invokeMethod(method, args);
};
switch (call.method) {
case "getPlatformVersion":
return "Browser ";
case "start":
final String url = arguments["url"] ?? "";
// String title = arguments["title"];
// String desc = arguments["desc"];
// String cover = arguments["cover"];
final bool isAuto = arguments["isAuto"] ?? false;
final bool isLocal = arguments["isLocal"] ?? false;
// bool isLocalCover = arguments["isLocalCover"] ?? false;
start(playerId, _resolveAssetUrl(url, isLocal: isLocal));
if (isAuto) {
player.play();
}
return "";
case "playOrPause":
if (player.isPlaying) {
player.pause();
} else {
player.resume();
}
return player.isPlaying;
case "play":
player.resume();
return player.isPlaying;
case "pause":
player.pause();
return player.isPlaying;
case "stop":
player.stop();
return null;
case "release":
player.release();
return null;
case "seekTo":
final double position =
(arguments['position'] as num?)?.toDouble() ?? 0;
player.seekTo(position);
return "";
case "rate":
final double rate = (arguments['rate'] as num?)?.toDouble() ?? 1.0;
player.setRate(rate);
return "";
case "setVolume":
// facade 发送的键是 value,不是 volume。
final double volume = (arguments['value'] as num?)?.toDouble() ?? 1.0;
player.setVolume(volume);
// 与 Android 端一致:音量变化后回发 volumeChange,让 Dart 侧同步状态。
_channel?.invokeMethod('volumeChange', volume);
return "";
case "currentVolume":
return player.currentVolume;
case "updateLrc":
return "";
case "updateInfo":
return "";
case "getState":
final double positionMs = (player.player?.currentTime ?? 0) * 1000;
final double durationMs = (player.player?.duration ?? 0) * 1000;
return {
'isPlaying': player.isPlaying,
'position': positionMs.isFinite ? positionMs.round() : 0,
'duration': durationMs.isFinite ? durationMs.round() : 0,
'title': '',
'desc': '',
'cover': '',
'url': player.currentUrl,
};
default:
throw PlatformException(
code: 'Unimplemented',
details:
"The plugin for web doesn't implement the method '${call.method}'",
);
}
}