Dart SDK пока не поддерживает некоторые методы в классе MediaDevices, включая getUserMedia https://github.com/dart-lang/sdk/issues/35253. Для таких браузеров, как Chrome и Firefox, это было нормально, поскольку более старая реализация getUserMedia на основе обратного вызова все еще находится непосредственно в объекте window.navigator. Но с Safari, который, я думаю, только недавно реализовал эту функциональность, поддерживается только более новый вариант MediaDevices, который возвращает обещание.
Я пытаюсь выяснить, как добавить этот метод в существующий класс Dart MediaDevices, так что он может вызывать встроенную функцию javascript, обрабатывать полученное обещание и преобразовывать результат, переданный в случае успеха, обратно в объект Dart MediaStream.
Здесь есть старая публикация, которая казалась многообещающей, но я не могу заставить этот пример успешно работать сейчас и подозреваю, что он либо не имеет отношения к Dart 2+, либо неуместен, если класс Dart уже существует (что является ошибка, которую я получаю, указывает). Дарт JS Взаимодействие 0.6.0 и JS Обещания - разрешение
Самое близкое, что я достиг к успеху, - это go назад к более старому подходу Дарта к взаимодействию JsObject. Я могу вызвать метод getUserMedia и получить объект обещания, но в настоящее время он всегда завершается с ошибкой, в которой говорится, что я должен запросить аудио или видео. Так что что-то не так с моим синтаксисом параметра или с тем, как он преобразуется в JS:
JsObject jsObj = context['navigator']['mediaDevices'];
JsObject promise = jsObj.callMethod("getUserMedia",
[{'audio': true, 'video': false}]);
promise.callMethod('then', [
(_){
completer.complete(true);
print('success...');
},
(e){
completer.complete(false);
print('fail...');
}
]);
Однако, даже если я пройду мимо этого, я все еще не вижу, как преобразовать результат обратно в объект Dart MediaStream. Кто-нибудь знает какую-либо информацию для заполнения недостающих частей SDK, как это?