Skip to content

Commit 29b2e8d

Browse files
authored
Update lint package & rules (#869)
* Updated lints package to 6.0.0. * New rules: `discarded_futures` & `prefer_final_locals`. * Did some quick maintenance to some lint errors. There's quite a few "disregarded futures" (Un-awaited Futures) we should clean them up.
1 parent 9e3f0ab commit 29b2e8d

34 files changed

+338
-515
lines changed

analysis_options.yaml

Lines changed: 8 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
# Copyright 2024 LiveKit, Inc.
1+
#
2+
# Copyright 2025 LiveKit
23
#
34
# Licensed under the Apache License, Version 2.0 (the "License");
45
# you may not use this file except in compliance with the License.
@@ -12,34 +13,15 @@
1213
# See the License for the specific language governing permissions and
1314
# limitations under the License.
1415

15-
# This file configures the analyzer, which statically analyzes Dart code to
16-
# check for errors, warnings, and lints.
17-
#
18-
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
19-
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
20-
# invoked from the command line by running `flutter analyze`.
21-
22-
# The following line activates a set of recommended lints for Flutter apps,
23-
# packages, and plugins designed to encourage good coding practices.
24-
25-
# https://pub.dev/packages/flutter_lints
26-
2716
include: package:lints/recommended.yaml
2817

2918
analyzer:
3019
errors:
3120
constant_identifier_names: ignore
3221
no_wildcard_variable_uses: ignore
3322
use_super_parameters: ignore
34-
#
35-
# Enforce stricter type-checking
36-
# https://dart.dev/guides/language/analysis-options#enabling-additional-type-checks
37-
# https://dash-overflow.net/articles/getting_started/#step-3-disabling-_implicit-dynamic_--_implicit-cast_
38-
#
3923

40-
#
41-
# exclude protobuf files
42-
#
24+
# Exclude protobuf files
4325
exclude:
4426
- '**/*.pb.dart'
4527
- '**/*.pbenum.dart'
@@ -49,10 +31,11 @@ analyzer:
4931

5032
linter:
5133
rules:
52-
#
53-
# Additional recommended rules
54-
#
34+
# Preference of the SDK
5535
prefer_single_quotes: true
36+
prefer_final_locals: true
5637
unnecessary_brace_in_string_interps: false
38+
39+
# Enforce this for correct async logic
5740
unawaited_futures: true
58-
depend_on_referenced_packages: false
41+
discarded_futures: true

lib/livekit_client.dart

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,6 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
/// Flutter Client SDK to LiveKit.
16-
library livekit_client;
17-
1815
export 'src/constants.dart';
1916
export 'src/core/room.dart';
2017
export 'src/data_stream/stream_reader.dart';

lib/src/core/engine.dart

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
336336
final message =
337337
rtc.RTCDataChannelMessage.fromBinary(packet.writeToBuffer());
338338

339-
var reliabilityType =
339+
final reliabilityType =
340340
reliability == true ? Reliability.reliable : Reliability.lossy;
341341

342342
if (_subscriberPrimary) {
@@ -625,7 +625,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
625625
Future<void> _handleGettingConnectedServerAddress(
626626
rtc.RTCPeerConnection pc) async {
627627
try {
628-
var remoteAddress = await getConnectedAddress(publisher!.pc);
628+
final remoteAddress = await getConnectedAddress(publisher!.pc);
629629
logger.fine('Connected address: $remoteAddress');
630630
if (_connectedServerAddress == null ||
631631
_connectedServerAddress != remoteAddress) {
@@ -740,7 +740,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
740740
return;
741741
}
742742

743-
var delay = defaultRetryDelaysInMs[reconnectAttempts!];
743+
final delay = defaultRetryDelaysInMs[reconnectAttempts!];
744744

745745
events.emit(EngineAttemptReconnectEvent(
746746
attempt: reconnectAttempts! + 1,
@@ -965,7 +965,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
965965
// create peer connections
966966
_subscriberPrimary = event.response.subscriberPrimary;
967967
_serverInfo = event.response.serverInfo;
968-
var iceServersFromServer =
968+
final iceServersFromServer =
969969
event.response.iceServers.map((e) => e.toSDKType()).toList();
970970

971971
if (iceServersFromServer.isNotEmpty) {
@@ -979,7 +979,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
979979
'iceServers: ${event.response.iceServers}, '
980980
'forceRelay: $event.response.clientConfiguration.forceRelay');
981981

982-
var rtcConfiguration = await _buildRtcConfiguration(
982+
final rtcConfiguration = await _buildRtcConfiguration(
983983
serverResponseForceRelay:
984984
event.response.clientConfiguration.forceRelay,
985985
serverProvidedIceServers: _serverProvidedIceServers);
@@ -1000,7 +1000,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
10001000
events.emit(EngineJoinResponseEvent(response: event.response));
10011001
})
10021002
..on<SignalReconnectResponseEvent>((event) async {
1003-
var iceServersFromServer =
1003+
final iceServersFromServer =
10041004
event.response.iceServers.map((e) => e.toSDKType()).toList();
10051005

10061006
if (iceServersFromServer.isNotEmpty) {
@@ -1013,7 +1013,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
10131013
'iceServers: ${event.response.iceServers}, '
10141014
'forceRelay: $event.response.clientConfiguration.forceRelay');
10151015

1016-
var rtcConfiguration = await _buildRtcConfiguration(
1016+
final rtcConfiguration = await _buildRtcConfiguration(
10171017
serverResponseForceRelay:
10181018
event.response.clientConfiguration.forceRelay,
10191019
serverProvidedIceServers: _serverProvidedIceServers);
@@ -1055,7 +1055,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
10551055
logger.warning('[$objectId] subscriber is null');
10561056
return;
10571057
}
1058-
var signalingState = await subscriber!.pc.getSignalingState();
1058+
final signalingState = await subscriber!.pc.getSignalingState();
10591059
logger.fine('[$objectId] Received server offer(type: ${event.sd.type}, '
10601060
'$signalingState)');
10611061
logger.finer('sdp: ${event.sd.sdp}');
@@ -1182,7 +1182,7 @@ extension EngineInternalMethods on Engine {
11821182
if (track.mediaStreamTrack.kind == 'video' && opts is VideoPublishOptions) {
11831183
track.codec = opts.videoCodec;
11841184
}
1185-
var transceiverInit = rtc.RTCRtpTransceiverInit(
1185+
final transceiverInit = rtc.RTCRtpTransceiverInit(
11861186
direction: rtc.TransceiverDirection.SendOnly,
11871187
);
11881188
if (encodings != null) {
@@ -1215,7 +1215,7 @@ extension EngineInternalMethods on Engine {
12151215
if (publisher == null) {
12161216
throw Exception('publisher is closed');
12171217
}
1218-
var transceiverInit = rtc.RTCRtpTransceiverInit(
1218+
final transceiverInit = rtc.RTCRtpTransceiverInit(
12191219
direction: rtc.TransceiverDirection.SendOnly,
12201220
);
12211221
if (encodings != null) {
@@ -1235,22 +1235,22 @@ extension EngineInternalMethods on Engine {
12351235
rtc.RTCRtpTransceiver transceiver, String kind, String videoCodec) async {
12361236
// when setting codec preferences, the capabilites need to be read from
12371237
// the RTCRtpReceiver
1238-
var caps = await rtc.getRtpReceiverCapabilities(kind);
1238+
final caps = await rtc.getRtpReceiverCapabilities(kind);
12391239
if (caps.codecs == null) return;
12401240

12411241
logger.fine('get capabilities ${caps.codecs}');
12421242

1243-
List<rtc.RTCRtpCodecCapability> matched = [];
1244-
List<rtc.RTCRtpCodecCapability> partialMatched = [];
1245-
List<rtc.RTCRtpCodecCapability> unmatched = [];
1243+
final List<rtc.RTCRtpCodecCapability> matched = [];
1244+
final List<rtc.RTCRtpCodecCapability> partialMatched = [];
1245+
final List<rtc.RTCRtpCodecCapability> unmatched = [];
12461246
for (var c in caps.codecs!) {
1247-
var codec = c.mimeType.toLowerCase();
1247+
final codec = c.mimeType.toLowerCase();
12481248
if (codec == 'audio/opus') {
12491249
matched.add(c);
12501250
continue;
12511251
}
12521252

1253-
var matchesVideoCodec = codec == 'video/$videoCodec';
1253+
final matchesVideoCodec = codec == 'video/$videoCodec';
12541254
if (!matchesVideoCodec) {
12551255
if (lkPlatformIs(PlatformType.android) && codec == 'video/vp9') {
12561256
if (c.sdpFmtpLine != null &&

lib/src/core/room.dart

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,7 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
338338
if (publication.track! is! LocalVideoTrack) {
339339
return;
340340
}
341-
var videoTrack = publication.track as LocalVideoTrack;
341+
final videoTrack = publication.track as LocalVideoTrack;
342342
final newCodecs = await videoTrack.setPublishingCodecs(
343343
event.subscribedCodecs, videoTrack);
344344
for (var codec in newCodecs) {
@@ -350,7 +350,7 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
350350
}
351351
}
352352
} else if (event.subscribedQualities.isNotEmpty) {
353-
var videoTrack = publication.track as LocalVideoTrack;
353+
final videoTrack = publication.track as LocalVideoTrack;
354354
await videoTrack.updatePublishingLayers(
355355
videoTrack, event.subscribedQualities);
356356
}
@@ -413,7 +413,7 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
413413
});
414414

415415
void _setUpEngineListeners() => _engineListener
416-
..on<EngineJoinResponseEvent>((event) {
416+
..on<EngineJoinResponseEvent>((event) async {
417417
_roomInfo = event.response.room;
418418
_name = event.response.room.name;
419419
_metadata = event.response.room.metadata;
@@ -435,47 +435,47 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
435435
);
436436

437437
if (engine.fullReconnectOnNext) {
438-
_localParticipant!.updateFromInfo(event.response.participant);
438+
await _localParticipant!.updateFromInfo(event.response.participant);
439439
}
440440

441441
if (connectOptions.protocolVersion.index >= ProtocolVersion.v8.index &&
442442
engine.fastConnectOptions != null &&
443443
!engine.fullReconnectOnNext) {
444-
var options = engine.fastConnectOptions!;
444+
final options = engine.fastConnectOptions!;
445445

446-
var audio = options.microphone;
447-
bool audioEnabled = audio.enabled == true || audio.track != null;
446+
final audio = options.microphone;
447+
final bool audioEnabled = audio.enabled == true || audio.track != null;
448448
if (audioEnabled) {
449449
if (audio.track != null) {
450-
_localParticipant!.publishAudioTrack(audio.track as LocalAudioTrack,
450+
await _localParticipant!.publishAudioTrack(audio.track as LocalAudioTrack,
451451
publishOptions: roomOptions.defaultAudioPublishOptions);
452452
} else {
453-
_localParticipant!.setMicrophoneEnabled(true,
453+
await _localParticipant!.setMicrophoneEnabled(true,
454454
audioCaptureOptions: roomOptions.defaultAudioCaptureOptions);
455455
}
456456
}
457457

458-
var video = options.camera;
459-
bool videoEnabled = video.enabled == true || video.track != null;
458+
final video = options.camera;
459+
final bool videoEnabled = video.enabled == true || video.track != null;
460460
if (videoEnabled) {
461461
if (video.track != null) {
462-
_localParticipant!.publishVideoTrack(video.track as LocalVideoTrack,
462+
await _localParticipant!.publishVideoTrack(video.track as LocalVideoTrack,
463463
publishOptions: roomOptions.defaultVideoPublishOptions);
464464
} else {
465-
_localParticipant!.setCameraEnabled(true,
465+
await _localParticipant!.setCameraEnabled(true,
466466
cameraCaptureOptions: roomOptions.defaultCameraCaptureOptions);
467467
}
468468
}
469469

470-
var screen = options.screen;
471-
bool screenEnabled = screen.enabled == true || screen.track != null;
470+
final screen = options.screen;
471+
final bool screenEnabled = screen.enabled == true || screen.track != null;
472472
if (screenEnabled) {
473473
if (screen.track != null) {
474-
_localParticipant!.publishVideoTrack(
474+
await _localParticipant!.publishVideoTrack(
475475
screen.track as LocalVideoTrack,
476476
publishOptions: roomOptions.defaultVideoPublishOptions);
477477
} else {
478-
_localParticipant!.setScreenShareEnabled(true,
478+
await _localParticipant!.setScreenShareEnabled(true,
479479
screenShareCaptureOptions:
480480
roomOptions.defaultScreenShareCaptureOptions);
481481
}
@@ -490,7 +490,7 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
490490
}
491491

492492
if (e2eeManager != null && event.response.sifTrailer.isNotEmpty) {
493-
e2eeManager!.keyProvider
493+
await e2eeManager!.keyProvider
494494
.setSifTrailer(Uint8List.fromList(event.response.sifTrailer));
495495
}
496496

@@ -507,7 +507,7 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
507507
events.emit(const RoomReconnectingEvent());
508508

509509
// clean up RemoteParticipants
510-
var copy = _remoteParticipants.values.toList();
510+
final copy = _remoteParticipants.values.toList();
511511

512512
_remoteParticipants.clear();
513513
_sidToIdentity.clear();
@@ -581,7 +581,7 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
581581

582582
final idParts = unpackStreamId(event.stream.id);
583583
final participantSid = idParts[0];
584-
var streamId = idParts[1];
584+
final streamId = idParts[1];
585585
var trackSid = event.track.id;
586586

587587
// firefox will get streamId (pID|trackId) instead of (pID|streamId) as it doesn't support sync tracks by stream
@@ -624,7 +624,7 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
624624

625625
/// Disconnects from the room, notifying server of disconnection.
626626
Future<void> disconnect() async {
627-
bool isPendingReconnect = engine.isPendingReconnect;
627+
final bool isPendingReconnect = engine.isPendingReconnect;
628628
if (engine.isClosed &&
629629
!isPendingReconnect &&
630630
engine.connectionState == ConnectionState.disconnected) {
@@ -766,7 +766,7 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
766766
// updates are sent only when there's a change to speaker ordering
767767
void _onEngineActiveSpeakersUpdateEvent(
768768
List<lk_models.SpeakerInfo> speakers) {
769-
List<Participant> activeSpeakers = [];
769+
final List<Participant> activeSpeakers = [];
770770

771771
// localParticipant & remote participants
772772
final allParticipants = <String, Participant>{
@@ -816,7 +816,7 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
816816
void _onSignalStreamStateUpdateEvent(
817817
List<lk_rtc.StreamStateInfo> updates) async {
818818
for (final update in updates) {
819-
var identity = _sidToIdentity[update.participantSid];
819+
final identity = _sidToIdentity[update.participantSid];
820820
if (identity == null) {
821821
logger
822822
.warning('participant not found for sid ${update.participantSid}');
@@ -848,7 +848,7 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
848848
final publication =
849849
participant.getTrackPublicationBySid(event.transcription.trackId);
850850

851-
var segments = event.transcription.segments.map((segment) {
851+
final segments = event.transcription.segments.map((segment) {
852852
return TranscriptionSegment(
853853
text: segment.text,
854854
id: segment.id,
@@ -941,7 +941,7 @@ extension RoomPrivateMethods on Room {
941941
logger.fine('[${objectId}] cleanUp()');
942942

943943
// clean up RemoteParticipants
944-
var participants = _remoteParticipants.values.toList();
944+
final participants = _remoteParticipants.values.toList();
945945
for (final participant in participants) {
946946
await participant.removeAllPublishedTracks(notify: false);
947947
// RemoteParticipant is responsible for disposing resources
@@ -1153,7 +1153,7 @@ extension RoomHardwareManagementMethods on Room {
11531153

11541154
Future<void> startAudio() async {
11551155
try {
1156-
var audioContextRunning = await audio.startAllAudioElement();
1156+
final audioContextRunning = await audio.startAllAudioElement();
11571157
if (audioContextRunning) {
11581158
_handleAudioPlaybackStarted();
11591159
} else {
@@ -1286,7 +1286,7 @@ extension DataStreamRoomMethods on Room {
12861286
return;
12871287
}
12881288

1289-
var info = ByteStreamInfo(
1289+
final info = ByteStreamInfo(
12901290
id: streamHeader.streamId,
12911291
name: streamHeader.byteHeader.name,
12921292
mimeType: streamHeader.mimeType,
@@ -1298,7 +1298,7 @@ extension DataStreamRoomMethods on Room {
12981298
attributes: streamHeader.attributes,
12991299
);
13001300

1301-
var streamController = DataStreamController<lk_models.DataStream_Chunk>(
1301+
final streamController = DataStreamController<lk_models.DataStream_Chunk>(
13021302
info: info,
13031303
streamController: StreamController<lk_models.DataStream_Chunk>(),
13041304
startTime: DateTime.timestamp().millisecondsSinceEpoch,
@@ -1320,7 +1320,7 @@ extension DataStreamRoomMethods on Room {
13201320
return;
13211321
}
13221322

1323-
var info = TextStreamInfo(
1323+
final info = TextStreamInfo(
13241324
id: streamHeader.streamId,
13251325
mimeType: streamHeader.mimeType,
13261326
size: streamHeader.hasTotalLength()
@@ -1331,7 +1331,7 @@ extension DataStreamRoomMethods on Room {
13311331
attributes: streamHeader.attributes,
13321332
);
13331333

1334-
var streamController = DataStreamController<lk_models.DataStream_Chunk>(
1334+
final streamController = DataStreamController<lk_models.DataStream_Chunk>(
13351335
info: info,
13361336
streamController: StreamController<lk_models.DataStream_Chunk>(),
13371337
startTime: DateTime.timestamp().millisecondsSinceEpoch,

0 commit comments

Comments
 (0)