Apply Flutter best practices [Non-Breaking] (#2)
* Add flutter_lints package * Use key in widget constructors lint: use_key_in_widget_constructors * Unnecessary new keyword lint: unnecessary_new * Prefer const with constant constructors * Exclude protobuf files from analyzer * Private field could be final * Annotate overridden members * Use initializing formals when possible * Don't access members with `this` unless avoiding shadowing * Prefer is! operator * Use isEmpty instead of length * Use collection literals when possible * Revert comment changes * Cleaner null testing * Misc fixes * Avoid using `forEach` with a function literal * Prefer `final` over `var` where applicable * Enforce stricter type-checking * Ignore VS Code files * Flutter format * Prefer using lowerCamelCase for constant names * flutter format -l 100 * Disable `avoid_print` for examples * Slight improvements to example Should solve lint error: no_logic_in_create_state
This commit is contained in:
@@ -9,10 +9,10 @@ const audioContainerId = 'livekit_audio_container';
|
||||
const audioPrefix = 'livekit_audio_';
|
||||
|
||||
void startAudio(String id, MediaStreamTrack track) {
|
||||
if (!(track is MediaStreamTrackWeb)) {
|
||||
if (track is! MediaStreamTrackWeb) {
|
||||
return;
|
||||
}
|
||||
var elementId = audioPrefix + id;
|
||||
final elementId = audioPrefix + id;
|
||||
var audioElement = html.document.getElementById(elementId);
|
||||
if (audioElement == null) {
|
||||
audioElement = html.AudioElement()
|
||||
@@ -21,16 +21,16 @@ void startAudio(String id, MediaStreamTrack track) {
|
||||
findOrCreateAudioContainer().append(audioElement);
|
||||
}
|
||||
|
||||
if (!(audioElement is html.AudioElement)) {
|
||||
if (audioElement is! html.AudioElement) {
|
||||
return;
|
||||
}
|
||||
var audioStream = html.MediaStream();
|
||||
final audioStream = html.MediaStream();
|
||||
audioStream.addTrack(track.jsTrack);
|
||||
audioElement.srcObject = audioStream;
|
||||
}
|
||||
|
||||
void stopAudio(String id) {
|
||||
var audioElement = html.document.getElementById(audioPrefix + id);
|
||||
final audioElement = html.document.getElementById(audioPrefix + id);
|
||||
if (audioElement != null) {
|
||||
if (audioElement is html.AudioElement) {
|
||||
audioElement.srcObject = null;
|
||||
|
||||
@@ -13,14 +13,14 @@ class AudioTrack extends Track {
|
||||
|
||||
/// Start playing audio track. On web platform, create an audio element and
|
||||
/// start playback
|
||||
start() {
|
||||
if (!(this is LocalAudioTrack)) {
|
||||
void start() {
|
||||
if (this is! LocalAudioTrack) {
|
||||
audio.startAudio(getCid(), mediaTrack);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
stop() {
|
||||
void stop() {
|
||||
mediaStream?.dispose();
|
||||
mediaStream = null;
|
||||
audio.stopAudio(getCid());
|
||||
|
||||
@@ -9,19 +9,18 @@ class LocalAudioTrack extends AudioTrack {
|
||||
: super(name, track, stream);
|
||||
|
||||
/// Creates a new audio track from the default audio input device.
|
||||
static Future<LocalAudioTrack> createTrack(
|
||||
[LocalAudioTrackOptions? options]) async {
|
||||
static Future<LocalAudioTrack> createTrack([LocalAudioTrackOptions? options]) async {
|
||||
try {
|
||||
var stream = await navigator.mediaDevices.getUserMedia({
|
||||
"audio": true,
|
||||
"video": false,
|
||||
final stream = await navigator.mediaDevices.getUserMedia(<String, dynamic>{
|
||||
'audio': true,
|
||||
'video': false,
|
||||
});
|
||||
|
||||
if (stream.getAudioTracks().length == 0) {
|
||||
if (stream.getAudioTracks().isEmpty) {
|
||||
return Future.error(TrackCreateError());
|
||||
}
|
||||
|
||||
return LocalAudioTrack("", stream.getAudioTracks().first, stream);
|
||||
return LocalAudioTrack('', stream.getAudioTracks().first, stream);
|
||||
} catch (e) {
|
||||
return Future.error(e);
|
||||
}
|
||||
|
||||
@@ -4,14 +4,14 @@ import 'track.dart';
|
||||
import 'track_publication.dart';
|
||||
|
||||
class LocalTrackPublication extends TrackPublication {
|
||||
LocalParticipant _participant;
|
||||
final LocalParticipant _participant;
|
||||
|
||||
LocalTrackPublication(TrackInfo info, Track track, this._participant)
|
||||
: super.fromInfo(info) {
|
||||
LocalTrackPublication(TrackInfo info, Track track, this._participant) : super.fromInfo(info) {
|
||||
this.track = track;
|
||||
}
|
||||
|
||||
/// Mute or unmute the current track. When muted, track will stop sending data
|
||||
@override
|
||||
set muted(bool val) {
|
||||
if (val == muted) {
|
||||
return;
|
||||
|
||||
@@ -13,15 +13,12 @@ class LocalVideoTrack extends VideoTrack {
|
||||
: super(name, mediaTrack, stream);
|
||||
|
||||
/// Creates a LocalVideoTrack from camera input.
|
||||
static Future<LocalVideoTrack> createCameraTrack(
|
||||
[LocalVideoTrackOptions? options]) async {
|
||||
if (options == null) {
|
||||
options = LocalVideoTrackOptions(params: VideoPresets.qhd);
|
||||
}
|
||||
static Future<LocalVideoTrack> createCameraTrack([LocalVideoTrackOptions? options]) async {
|
||||
options ??= LocalVideoTrackOptions(params: VideoPresets.qhd);
|
||||
|
||||
try {
|
||||
var stream = await _createCameraStream(options);
|
||||
return LocalVideoTrack("camera", stream.getVideoTracks().first, stream);
|
||||
final stream = await _createCameraStream(options);
|
||||
return LocalVideoTrack('camera', stream.getVideoTracks().first, stream);
|
||||
} catch (e) {
|
||||
return Future.error(e);
|
||||
}
|
||||
@@ -34,13 +31,11 @@ class LocalVideoTrack extends VideoTrack {
|
||||
return Future.error(TrackCreateError('could not restart track'));
|
||||
}
|
||||
|
||||
if (options == null) {
|
||||
options = LocalVideoTrackOptions(params: VideoPresets.qhd);
|
||||
}
|
||||
options ??= LocalVideoTrackOptions(params: VideoPresets.qhd);
|
||||
|
||||
try {
|
||||
var stream = await _createCameraStream(options);
|
||||
var track = stream.getVideoTracks().first;
|
||||
final stream = await _createCameraStream(options);
|
||||
final track = stream.getVideoTracks().first;
|
||||
mediaStream = stream;
|
||||
await mediaTrack.stop();
|
||||
mediaTrack = track;
|
||||
@@ -50,19 +45,16 @@ class LocalVideoTrack extends VideoTrack {
|
||||
}
|
||||
}
|
||||
|
||||
static Future<MediaStream> _createCameraStream(
|
||||
LocalVideoTrackOptions? options) async {
|
||||
if (options == null) {
|
||||
options = LocalVideoTrackOptions(params: VideoPresets.qhd);
|
||||
}
|
||||
static Future<MediaStream> _createCameraStream(LocalVideoTrackOptions? options) async {
|
||||
options ??= LocalVideoTrackOptions(params: VideoPresets.qhd);
|
||||
|
||||
try {
|
||||
var stream = await navigator.mediaDevices.getUserMedia({
|
||||
"audio": false,
|
||||
"video": options.mediaConstraints,
|
||||
final stream = await navigator.mediaDevices.getUserMedia(<String, dynamic>{
|
||||
'audio': false,
|
||||
'video': options.mediaConstraints,
|
||||
});
|
||||
|
||||
if (stream.getVideoTracks().length == 0) {
|
||||
if (stream.getVideoTracks().isEmpty) {
|
||||
return Future.error(TrackCreateError());
|
||||
}
|
||||
|
||||
|
||||
+12
-12
@@ -1,6 +1,6 @@
|
||||
/// Options when creating a LocalVideoTrack.
|
||||
class LocalVideoTrackOptions {
|
||||
CameraPosition position = CameraPosition.FRONT;
|
||||
CameraPosition position = CameraPosition.front;
|
||||
VideoParameter params;
|
||||
|
||||
LocalVideoTrackOptions({
|
||||
@@ -16,16 +16,16 @@ class LocalVideoTrackOptions {
|
||||
}
|
||||
|
||||
Map<String, dynamic> get mediaConstraints {
|
||||
return {
|
||||
"mandatory": params.mediaConstraints,
|
||||
"facingMode": position == CameraPosition.FRONT ? "user" : "environment",
|
||||
return <String, dynamic>{
|
||||
'mandatory': params.mediaConstraints,
|
||||
'facingMode': position == CameraPosition.front ? 'user' : 'environment',
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
enum CameraPosition {
|
||||
FRONT,
|
||||
BACK,
|
||||
front,
|
||||
back,
|
||||
}
|
||||
|
||||
class VideoParameter {
|
||||
@@ -38,14 +38,14 @@ class VideoParameter {
|
||||
this.width,
|
||||
this.height,
|
||||
this.fps, {
|
||||
int? bitrate,
|
||||
}) : this.bitrate = bitrate;
|
||||
this.bitrate,
|
||||
});
|
||||
|
||||
Map<String, dynamic> get mediaConstraints {
|
||||
return {
|
||||
"minWidth": this.width,
|
||||
"minHeight": this.height,
|
||||
"minFrameRate": this.fps,
|
||||
return <String, dynamic>{
|
||||
'minWidth': width,
|
||||
'minHeight': height,
|
||||
'minFrameRate': fps,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ import 'track_publication.dart';
|
||||
/// Represents a track publication from a RemoteParticipant. Provides methods to
|
||||
/// control if we should subscribe to the track, and its quality (for video).
|
||||
class RemoteTrackPublication extends TrackPublication {
|
||||
RemoteParticipant _participant;
|
||||
final RemoteParticipant _participant;
|
||||
bool _unsubscribed = false;
|
||||
bool _disabled = false;
|
||||
VideoQuality _videoQuality = VideoQuality.HIGH;
|
||||
@@ -26,6 +26,7 @@ class RemoteTrackPublication extends TrackPublication {
|
||||
_sendUpdateTrackSettings();
|
||||
}
|
||||
|
||||
@override
|
||||
bool get subscribed {
|
||||
if (_unsubscribed) {
|
||||
return false;
|
||||
@@ -41,6 +42,7 @@ class RemoteTrackPublication extends TrackPublication {
|
||||
|
||||
/// for internal use
|
||||
/// {@nodoc}
|
||||
@override
|
||||
set muted(bool val) {
|
||||
if (val == muted) {
|
||||
return;
|
||||
@@ -59,13 +61,12 @@ class RemoteTrackPublication extends TrackPublication {
|
||||
_participant.muteChanged();
|
||||
}
|
||||
|
||||
RemoteTrackPublication(TrackInfo info, this._participant, [Track? track])
|
||||
: super.fromInfo(info) {
|
||||
RemoteTrackPublication(TrackInfo info, this._participant, [Track? track]) : super.fromInfo(info) {
|
||||
this.track = track;
|
||||
}
|
||||
|
||||
_sendUpdateTrackSettings() {
|
||||
var settings = new UpdateTrackSettings(
|
||||
void _sendUpdateTrackSettings() {
|
||||
final settings = UpdateTrackSettings(
|
||||
trackSids: [sid],
|
||||
disabled: _disabled,
|
||||
);
|
||||
|
||||
@@ -12,7 +12,7 @@ class TrackDimension {
|
||||
|
||||
/// Wrapper around a MediaStreamTrack with additional metadata.
|
||||
class Track {
|
||||
static const ScreenShareName = "screen";
|
||||
static const screenShareName = 'screen';
|
||||
|
||||
String name;
|
||||
TrackType kind;
|
||||
@@ -38,19 +38,17 @@ class Track {
|
||||
}
|
||||
|
||||
String getCid() {
|
||||
var cid = _cid;
|
||||
var cid = _cid ?? mediaTrack.id;
|
||||
|
||||
if (cid == null) {
|
||||
cid = mediaTrack.id;
|
||||
}
|
||||
if (cid == null) {
|
||||
var uuid = Uuid();
|
||||
const uuid = Uuid();
|
||||
cid = uuid.v4();
|
||||
_cid = cid;
|
||||
}
|
||||
return cid;
|
||||
}
|
||||
|
||||
stop() {
|
||||
void stop() {
|
||||
mediaTrack.stop();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,15 +21,14 @@ class TrackPublication {
|
||||
updateFromInfo(info);
|
||||
}
|
||||
|
||||
/// True when the track is published with name [Track.ScreenShareName].
|
||||
bool get isScreenShare =>
|
||||
kind == TrackType.VIDEO && name == Track.ScreenShareName;
|
||||
/// True when the track is published with name [Track.screenShareName].
|
||||
bool get isScreenShare => kind == TrackType.VIDEO && name == Track.screenShareName;
|
||||
|
||||
updateFromInfo(TrackInfo info) {
|
||||
void updateFromInfo(TrackInfo info) {
|
||||
muted = info.muted;
|
||||
simulcasted = info.simulcast;
|
||||
if (info.type == TrackType.VIDEO) {
|
||||
dimension = new TrackDimension(info.width, info.height);
|
||||
dimension = TrackDimension(info.width, info.height);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user