handleMethodCall method

Future handleMethodCall(
  1. MethodCall call
)

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}'",
      );
  }
}