Skip to content

Commit 5b0e9f1

Browse files
fix the warnings and remove the ignorance from flutter analyze (#906)
This PR removed some of the error ignorances from analysis_options.yaml and fixed the warnings. --------- Co-authored-by: Hiroshi Horie <[email protected]>
1 parent 9f790be commit 5b0e9f1

33 files changed

+203
-173
lines changed

.changes/flutter-lint-warnings

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
patch type="changed" "Re-enable Flutter lint warnings and fix existing issues"

analysis_options.yaml

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,7 @@ analyzer:
2121
no_wildcard_variable_uses: ignore
2222
use_super_parameters: ignore
2323
avoid_print: ignore
24-
use_build_context_synchronously: ignore
25-
discarded_futures: ignore
26-
prefer_final_locals: ignore
27-
depend_on_referenced_packages: ignore
28-
29-
# Suppress noisy or harmless warnings
3024
deprecated_member_use_from_same_package: ignore
31-
unused_element_parameter: ignore
32-
unintended_html_in_doc_comment: ignore
33-
implementation_imports: ignore
34-
invalid_runtime_check_with_js_interop_types: ignore
35-
unnecessary_import: ignore
3625

3726
# Exclude protobuf files
3827
exclude:

example/analysis_options.yaml

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,6 @@ analyzer:
3232
no_wildcard_variable_uses: ignore
3333
use_super_parameters: ignore
3434
avoid_print: ignore
35-
use_build_context_synchronously: ignore
36-
# TODO, fix the discarded_futures problems and re-enable the warnings
37-
discarded_futures: ignore
38-
prefer_final_locals: ignore
39-
depend_on_referenced_packages: ignore
4035

4136
# Exclude protobuf files
4237
exclude:

example/lib/pages/connect.dart

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'package:livekit_example/widgets/text_field.dart';
66
import 'package:shared_preferences/shared_preferences.dart';
77
import 'package:permission_handler/permission_handler.dart';
88

9+
import 'dart:async';
910
import '../exts.dart';
1011

1112
class ConnectPage extends StatefulWidget {
@@ -43,9 +44,9 @@ class _ConnectPageState extends State<ConnectPage> {
4344
@override
4445
void initState() {
4546
super.initState();
46-
_readPrefs();
47+
unawaited(_readPrefs());
4748
if (lkPlatformIs(PlatformType.android)) {
48-
_checkPermissions();
49+
unawaited(_checkPermissions());
4950
}
5051
}
5152

@@ -124,10 +125,10 @@ class _ConnectPageState extends State<ConnectPage> {
124125
print('Connecting with url: ${_uriCtrl.text}, '
125126
'token: ${_tokenCtrl.text}...');
126127

127-
var url = _uriCtrl.text;
128-
var token = _tokenCtrl.text;
129-
var e2eeKey = _sharedKeyCtrl.text;
130-
128+
final url = _uriCtrl.text;
129+
final token = _tokenCtrl.text;
130+
final e2eeKey = _sharedKeyCtrl.text;
131+
if (!ctx.mounted) return;
131132
await Navigator.push<void>(
132133
ctx,
133134
MaterialPageRoute(
@@ -147,6 +148,7 @@ class _ConnectPageState extends State<ConnectPage> {
147148
);
148149
} catch (error) {
149150
print('Could not connect $error');
151+
if (!ctx.mounted) return;
150152
await ctx.showErrorDialog(error);
151153
} finally {
152154
setState(() {

example/lib/pages/prejoin.dart

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,12 @@ class _PreJoinPageState extends State<PreJoinPage> {
6161
void initState() {
6262
super.initState();
6363
_subscription = Hardware.instance.onDeviceChange.stream.listen(_loadDevices);
64-
Hardware.instance.enumerateDevices().then(_loadDevices);
64+
unawaited(Hardware.instance.enumerateDevices().then(_loadDevices));
6565
}
6666

6767
@override
6868
void deactivate() {
69-
_subscription?.cancel();
69+
unawaited(_subscription?.cancel());
7070
super.deactivate();
7171
}
7272

@@ -151,7 +151,7 @@ class _PreJoinPageState extends State<PreJoinPage> {
151151

152152
@override
153153
void dispose() {
154-
_subscription?.cancel();
154+
unawaited(_subscription?.cancel());
155155
super.dispose();
156156
}
157157

@@ -160,16 +160,16 @@ class _PreJoinPageState extends State<PreJoinPage> {
160160

161161
setState(() {});
162162

163-
var args = widget.args;
163+
final args = widget.args;
164164

165165
try {
166166
//create new room
167-
var cameraEncoding = const VideoEncoding(
167+
const cameraEncoding = VideoEncoding(
168168
maxBitrate: 5 * 1000 * 1000,
169169
maxFramerate: 30,
170170
);
171171

172-
var screenEncoding = const VideoEncoding(
172+
const screenEncoding = VideoEncoding(
173173
maxBitrate: 3 * 1000 * 1000,
174174
maxFramerate: 15,
175175
);
@@ -226,12 +226,14 @@ class _PreJoinPageState extends State<PreJoinPage> {
226226
),
227227
);
228228

229+
if (!context.mounted) return;
229230
await Navigator.push<void>(
230231
context,
231232
MaterialPageRoute(builder: (_) => RoomPage(room, listener)),
232233
);
233234
} catch (error) {
234235
print('Could not connect $error');
236+
if (!context.mounted) return;
235237
await context.showErrorDialog(error);
236238
} finally {
237239
setState(() {
@@ -243,6 +245,7 @@ class _PreJoinPageState extends State<PreJoinPage> {
243245
void _actionBack(BuildContext context) async {
244246
await _setEnableVideo(false);
245247
await _setEnableAudio(false);
248+
if (!context.mounted) return;
246249
Navigator.of(context).pop();
247250
}
248251

example/lib/pages/room.dart

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ class _RoomPageState extends State<RoomPage> {
4444
});
4545

4646
if (lkPlatformIs(PlatformType.android)) {
47-
Hardware.instance.setSpeakerphoneOn(true);
47+
unawaited(Hardware.instance.setSpeakerphoneOn(true));
4848
}
4949

5050
if (lkPlatformIsDesktop()) {
@@ -58,15 +58,17 @@ class _RoomPageState extends State<RoomPage> {
5858
@override
5959
void dispose() {
6060
// always dispose listener
61-
(() async {
62-
widget.room.removeListener(_onRoomDidUpdate);
63-
await _listener.dispose();
64-
await widget.room.dispose();
65-
})();
61+
widget.room.removeListener(_onRoomDidUpdate);
62+
unawaited(_disposeRoomAsync());
6663
onWindowShouldClose = null;
6764
super.dispose();
6865
}
6966

67+
Future<void> _disposeRoomAsync() async {
68+
await _listener.dispose();
69+
await widget.room.dispose();
70+
}
71+
7072
/// for more information, see [event types](https://docs.livekit.io/client/events/#events)
7173
void _setUpListeners() => _listener
7274
..on<RoomDisconnectedEvent>((event) async {
@@ -81,7 +83,7 @@ class _RoomPageState extends State<RoomPage> {
8183
_sortParticipants();
8284
})
8385
..on<RoomRecordingStatusChanged>((event) {
84-
context.showRecordingStatusChangedDialog(event.activeRecording);
86+
unawaited(context.showRecordingStatusChangedDialog(event.activeRecording));
8587
})
8688
..on<RoomAttemptReconnectEvent>((event) {
8789
print('Attempting to reconnect ${event.attempt}/${event.maxAttemptsRetry}, '
@@ -112,12 +114,12 @@ class _RoomPageState extends State<RoomPage> {
112114
} catch (err) {
113115
print('Failed to decode: $err');
114116
}
115-
context.showDataReceivedDialog(decoded);
117+
unawaited(context.showDataReceivedDialog(decoded));
116118
})
117119
..on<AudioPlaybackStatusChanged>((event) async {
118120
if (!widget.room.canPlaybackAudio) {
119121
print('Audio playback failed for iOS Safari ..........');
120-
bool? yesno = await context.showPlayAudioManuallyDialog();
122+
final yesno = await context.showPlayAudioManuallyDialog();
121123
if (yesno == true) {
122124
await widget.room.startAudio();
123125
}
@@ -126,18 +128,21 @@ class _RoomPageState extends State<RoomPage> {
126128

127129
void _askPublish() async {
128130
final result = await context.showPublishDialog();
131+
if (!mounted) return;
129132
if (result != true) return;
130133
// video will fail when running in ios simulator
131134
try {
132135
await widget.room.localParticipant?.setCameraEnabled(true);
133136
} catch (error) {
134137
print('could not publish video: $error');
138+
if (!mounted) return;
135139
await context.showErrorDialog(error);
136140
}
137141
try {
138142
await widget.room.localParticipant?.setMicrophoneEnabled(true);
139143
} catch (error) {
140144
print('could not publish audio: $error');
145+
if (!mounted) return;
141146
await context.showErrorDialog(error);
142147
}
143148
}
@@ -151,8 +156,8 @@ class _RoomPageState extends State<RoomPage> {
151156
}
152157

153158
void _sortParticipants() {
154-
List<ParticipantTrack> userMediaTracks = [];
155-
List<ParticipantTrack> screenTracks = [];
159+
final userMediaTracks = <ParticipantTrack>[];
160+
final screenTracks = <ParticipantTrack>[];
156161
for (var participant in widget.room.remoteParticipants.values) {
157162
for (var t in participant.videoTrackPublications) {
158163
if (t.isScreenShare) {

example/lib/widgets/controls.dart

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'package:flutter/foundation.dart';
66
import 'package:flutter/material.dart';
77
import 'package:flutter_background/flutter_background.dart';
88
import 'package:livekit_client/livekit_client.dart';
9+
// ignore: depend_on_referenced_packages
910
import 'package:flutter_webrtc/flutter_webrtc.dart';
1011

1112
import '../exts.dart';
@@ -44,12 +45,12 @@ class _ControlsWidgetState extends State<ControlsWidget> {
4445
_subscription = Hardware.instance.onDeviceChange.stream.listen((List<MediaDevice> devices) {
4546
_loadDevices(devices);
4647
});
47-
Hardware.instance.enumerateDevices().then(_loadDevices);
48+
unawaited(Hardware.instance.enumerateDevices().then(_loadDevices));
4849
}
4950

5051
@override
5152
void dispose() {
52-
_subscription?.cancel();
53+
unawaited(_subscription?.cancel());
5354
participant.removeListener(_onChange);
5455
super.dispose();
5556
}
@@ -140,7 +141,7 @@ class _ControlsWidgetState extends State<ControlsWidget> {
140141
return;
141142
}
142143
print('DesktopCapturerSource: ${source.id}');
143-
var track = await LocalVideoTrack.createScreenShareTrack(
144+
final track = await LocalVideoTrack.createScreenShareTrack(
144145
ScreenShareCaptureOptions(
145146
sourceId: source.id,
146147
maxFrameRate: 15.0,
@@ -154,7 +155,7 @@ class _ControlsWidgetState extends State<ControlsWidget> {
154155
}
155156
if (lkPlatformIs(PlatformType.android)) {
156157
// Android specific
157-
bool hasCapturePermission = await Helper.requestCapturePermission();
158+
final hasCapturePermission = await Helper.requestCapturePermission();
158159
if (!hasCapturePermission) {
159160
return;
160161
}
@@ -187,6 +188,7 @@ class _ControlsWidgetState extends State<ControlsWidget> {
187188
}
188189

189190
if (lkPlatformIsWebMobile()) {
191+
if (!mounted) return;
190192
await context.showErrorDialog('Screen share is not supported on mobile web');
191193
return;
192194
}
@@ -218,6 +220,7 @@ class _ControlsWidgetState extends State<ControlsWidget> {
218220
allParticipantsAllowed: result,
219221
);
220222
} catch (error) {
223+
if (!mounted) return;
221224
await context.showErrorDialog(error);
222225
}
223226
}

example/lib/widgets/participant.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
33
import 'package:livekit_client/livekit_client.dart';
44
import 'package:livekit_example/theme.dart';
55

6+
import 'dart:async';
67
import 'no_video.dart';
78
import 'participant_info.dart';
89
import 'participant_stats.dart';
@@ -97,7 +98,7 @@ abstract class _ParticipantWidgetState<T extends ParticipantWidget> extends Stat
9798
@override
9899
void dispose() {
99100
widget.participant.removeListener(_onParticipantChanged);
100-
_listener?.dispose();
101+
unawaited(_listener?.dispose());
101102
super.dispose();
102103
}
103104

example/lib/widgets/participant_stats.dart

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:flutter/material.dart';
22
import 'package:livekit_client/livekit_client.dart';
3+
import 'dart:async';
34

45
enum StatsType {
56
kUnknown,
@@ -22,19 +23,19 @@ class _ParticipantStatsWidgetState extends State<ParticipantStatsWidget> {
2223
Map<String, Map<String, String>> stats = {'audio': {}, 'video': {}};
2324

2425
void _setUpListener(Track track) {
25-
var listener = track.createListener();
26+
final listener = track.createListener();
2627
listeners.add(listener);
2728
if (track is LocalVideoTrack) {
2829
statsType = StatsType.kLocalVideoSender;
2930
listener.on<VideoSenderStatsEvent>((event) {
30-
Map<String, String> stats = {};
31+
final stats = <String, String>{};
3132
setState(() {
3233
stats['tx'] = 'total sent ${event.currentBitrate.toInt()} kpbs';
3334
event.stats.forEach((key, value) {
3435
stats['layer-$key'] =
3536
'${value.frameWidth ?? 0}x${value.frameHeight ?? 0} ${value.framesPerSecond?.toDouble() ?? 0} fps, ${event.bitrateForLayers[key] ?? 0} kbps';
3637
});
37-
var firstStats = event.stats['f'] ?? event.stats['h'] ?? event.stats['q'];
38+
final firstStats = event.stats['f'] ?? event.stats['h'] ?? event.stats['q'];
3839
if (firstStats != null) {
3940
stats['encoder'] = firstStats.encoderImplementation ?? '';
4041
if (firstStats.mimeType != null) {
@@ -50,7 +51,7 @@ class _ParticipantStatsWidgetState extends State<ParticipantStatsWidget> {
5051
} else if (track is RemoteVideoTrack) {
5152
statsType = StatsType.kRemoteVideoReceiver;
5253
listener.on<VideoReceiverStatsEvent>((event) {
53-
Map<String, String> stats = {};
54+
final stats = <String, String>{};
5455
setState(() {
5556
if (!event.currentBitrate.isNaN) {
5657
stats['rx'] = '${event.currentBitrate.toInt()} kpbs';
@@ -75,7 +76,7 @@ class _ParticipantStatsWidgetState extends State<ParticipantStatsWidget> {
7576
} else if (track is LocalAudioTrack) {
7677
statsType = StatsType.kLocalAudioSender;
7778
listener.on<AudioSenderStatsEvent>((event) {
78-
Map<String, String> stats = {};
79+
final stats = <String, String>{};
7980
setState(() {
8081
stats['tx'] = '${event.currentBitrate.toInt()} kpbs';
8182
if (event.stats.mimeType != null) {
@@ -88,7 +89,7 @@ class _ParticipantStatsWidgetState extends State<ParticipantStatsWidget> {
8889
} else if (track is RemoteAudioTrack) {
8990
statsType = StatsType.kRemoteAudioReceiver;
9091
listener.on<AudioReceiverStatsEvent>((event) {
91-
Map<String, String> stats = {};
92+
final stats = <String, String>{};
9293
setState(() {
9394
stats['rx'] = '${event.currentBitrate.toInt()} kpbs';
9495
if (event.stats.mimeType != null) {
@@ -109,7 +110,7 @@ class _ParticipantStatsWidgetState extends State<ParticipantStatsWidget> {
109110

110111
_onParticipantChanged() {
111112
for (var element in listeners) {
112-
element.dispose();
113+
unawaited(element.dispose());
113114
}
114115
listeners.clear();
115116
for (var track in [...widget.participant.videoTrackPublications, ...widget.participant.audioTrackPublications]) {
@@ -130,7 +131,7 @@ class _ParticipantStatsWidgetState extends State<ParticipantStatsWidget> {
130131
@override
131132
void deactivate() {
132133
for (var element in listeners) {
133-
element.dispose();
134+
unawaited(element.dispose());
134135
}
135136
widget.participant.removeListener(_onParticipantChanged);
136137
super.deactivate();

0 commit comments

Comments
 (0)