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:
Hiroshi Horie
2021-08-31 16:35:07 +09:00
committed by GitHub
parent 4a75d78ef9
commit ab31ddabb9
41 changed files with 904 additions and 1228 deletions
+5 -5
View File
@@ -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;
+3 -3
View File
@@ -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());
+6 -7
View File
@@ -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);
}
+3 -3
View File
@@ -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 -21
View File
@@ -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
View File
@@ -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,
};
}
}
+6 -5
View File
@@ -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,
);
+5 -7
View File
@@ -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();
}
}
+4 -5
View File
@@ -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);
}
}
}