create method

  1. @override
Future<int> create(
  1. DataSource dataSource
)
override

Creates an instance of a video player and returns its textureId.

Implementation

@override
Future<int> create(DataSource dataSource) async {
  final int textureId = _textureCounter++;

  late String uri;
  switch (dataSource.sourceType) {
    case DataSourceType.network:
      // Do NOT modify the incoming uri, it can be a Blob, and Safari doesn't
      // like blobs that have changed.
      uri = dataSource.uri ?? '';
    case DataSourceType.asset:
      String assetUrl = dataSource.asset!;
      if (dataSource.package != null && dataSource.package!.isNotEmpty) {
        assetUrl = 'packages/${dataSource.package}/$assetUrl';
      }
      assetUrl = ui_web.assetManager.getAssetUrl(assetUrl);
      uri = assetUrl;
    case DataSourceType.file:
      return Future<int>.error(UnimplementedError(
          'web implementation of video_player cannot play local files'));
    case DataSourceType.contentUri:
      return Future<int>.error(UnimplementedError(
          'web implementation of video_player cannot play content uri'));
  }

  final web.HTMLVideoElement videoElement = web.HTMLVideoElement()
    ..id = 'videoElement-$textureId'
    ..style.border = 'none'
    ..style.height = '100%'
    ..style.width = '100%';

  // TODO(hterkelsen): Use initialization parameters once they are available
  ui_web.platformViewRegistry.registerViewFactory(
      'videoPlayer-$textureId', (int viewId) => videoElement);

  final VideoPlayer player = VideoPlayer(videoElement: videoElement)
    ..initialize(
      src: uri,
    );

  _videoPlayers[textureId] = player;

  return textureId;
}