Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migrate networking screen to null safety #3880

Merged
merged 8 commits into from
Mar 17, 2022
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 8 additions & 5 deletions packages/devtools_app/lib/src/http/http_request_data.dart
Original file line number Diff line number Diff line change
Expand Up @@ -605,11 +605,14 @@ class DartIOHttpRequestData extends HttpRequestData {
}

@override
DateTime? get endTimestamp => _endTime == null
? null
: DateTime.fromMicrosecondsSinceEpoch(
timelineMicrosecondsSinceEpoch(_endTime!),
);
DateTime? get endTimestamp {
final endTime = _endTime;
return endTime == null
? null
: DateTime.fromMicrosecondsSinceEpoch(
timelineMicrosecondsSinceEpoch(endTime),
);
}

@override
DateTime get startTimestamp => DateTime.fromMicrosecondsSinceEpoch(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -380,13 +380,13 @@ class NetworkController
@override
void filterData(Filter<NetworkRequest>? filter) {
serviceManager.errorBadgeManager.clearErrors(NetworkScreen.id);
if (filter?.queryFilter == null) {
if (filter == null || filter.queryFilter == null) {
bkonyi marked this conversation as resolved.
Show resolved Hide resolved
_requests.value.requests.forEach(_checkForError);
filteredData
..clear()
..addAll(_requests.value.requests);
} else {
final queryFilter = filter!.queryFilter!;
final queryFilter = filter.queryFilter!;
filteredData
..clear()
..addAll(_requests.value.requests.where((NetworkRequest r) {
Expand Down
44 changes: 28 additions & 16 deletions packages/devtools_app/lib/src/screens/network/network_model.dart
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,10 @@ abstract class NetworkRequest with DataSearchStateMixin {
/// True if the request hasn't completed yet.
bool get inProgress;

String get durationDisplay =>
'Duration: ${duration != null ? msText(duration!) : 'Pending'}';
String get durationDisplay {
final duration = this.duration;
return 'Duration: ${duration != null ? msText(duration) : 'Pending'}';
}

int timelineMicrosecondsSinceEpoch(int micros) {
return _timelineMicrosBase + micros;
Expand Down Expand Up @@ -85,31 +87,41 @@ class WebSocket extends NetworkRequest {

@override
Duration? get duration {
if (_socket.endTime == null) {
final endTime = _socket.endTime;
if (endTime == null) {
return null;
}
return Duration(microseconds: _socket.endTime! - _socket.startTime);
return Duration(microseconds: endTime - _socket.startTime);
}

@override
DateTime get startTimestamp => DateTime.fromMicrosecondsSinceEpoch(
timelineMicrosecondsSinceEpoch(_socket.startTime));

@override
DateTime? get endTimestamp => _socket.endTime != null
? DateTime.fromMicrosecondsSinceEpoch(
timelineMicrosecondsSinceEpoch(_socket.endTime!))
: null;
DateTime? get endTimestamp {
final endTime = _socket.endTime;
return endTime != null
? DateTime.fromMicrosecondsSinceEpoch(
timelineMicrosecondsSinceEpoch(endTime))
: null;
}

DateTime? get lastReadTimestamp => _socket.lastReadTime != null
? DateTime.fromMicrosecondsSinceEpoch(
timelineMicrosecondsSinceEpoch(_socket.lastReadTime!))
: null;
DateTime? get lastReadTimestamp {
final lastReadTime = _socket.lastReadTime;
return lastReadTime != null
? DateTime.fromMicrosecondsSinceEpoch(
timelineMicrosecondsSinceEpoch(lastReadTime))
: null;
}

DateTime? get lastWriteTimestamp => _socket.lastWriteTime != null
? DateTime.fromMicrosecondsSinceEpoch(
timelineMicrosecondsSinceEpoch(_socket.lastWriteTime!))
: null;
DateTime? get lastWriteTimestamp {
final lastWriteTime = _socket.lastWriteTime;
return lastWriteTime != null
? DateTime.fromMicrosecondsSinceEpoch(
timelineMicrosecondsSinceEpoch(lastWriteTime))
: null;
}

@override
String get contentType => 'websocket';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,30 +82,34 @@ class HttpRequestHeadersView extends StatelessWidget {

@override
Widget build(BuildContext context) {
final general = data.general;
final responseHeaders = data.responseHeaders;
final requestHeaders = data.requestHeaders;
return LayoutBuilder(
builder: (context, constraints) {
return ListView(
children: [
_buildTile(
'General',
[
for (final entry in data.general!.entries)
_buildRow(
context,
// TODO(kenz): ensure the default case of `entry.key` looks
// fine.
entry.key,
entry.value.toString(),
constraints,
),
if (general != null)
for (final entry in general.entries)
_buildRow(
context,
// TODO(kenz): ensure the default case of `entry.key` looks
// fine.
entry.key,
entry.value.toString(),
constraints,
),
],
key: generalKey,
),
_buildTile(
'Response Headers',
[
if (data.responseHeaders != null)
for (final entry in data.responseHeaders!.entries)
if (responseHeaders != null)
for (final entry in responseHeaders.entries)
_buildRow(
context,
entry.key,
Expand All @@ -118,8 +122,8 @@ class HttpRequestHeadersView extends StatelessWidget {
_buildTile(
'Request Headers',
[
if (data.requestHeaders != null)
for (final entry in data.requestHeaders!.entries)
if (requestHeaders != null)
for (final entry in requestHeaders.entries)
_buildRow(
context,
entry.key,
Expand Down Expand Up @@ -316,13 +320,13 @@ class HttpRequestCookiesView extends StatelessWidget {
}) {
final theme = Theme.of(context);
DataColumn _buildColumn(
String? title, {
String title, {
bool numeric = false,
}) {
return DataColumn(
label: Expanded(
child: SelectableText(
title ?? '--',
title,
// TODO(kenz): use top level overflow parameter if
// https://github.com/flutter/flutter/issues/82722 is fixed.
// TODO(kenz): add overflow after flutter 2.3.0 is stable. It was
Expand Down Expand Up @@ -507,7 +511,7 @@ class NetworkRequestOverviewView extends StatelessWidget {
const SizedBox(height: denseSpacing),
_buildRow(
context: context,
title: null,
title: '',
child: _valueText(data.durationDisplay),
),
const SizedBox(height: defaultSpacing),
Expand Down Expand Up @@ -607,7 +611,7 @@ class NetworkRequestOverviewView extends StatelessWidget {
result.addAll([
_buildRow(
context: context,
title: instant.name,
title: instant.name!,
child: _valueText(
'[${msText(timeRange.start! - instantEventStart)} - '
'${msText(timeRange.end! - instantEventStart)}]'
Expand Down Expand Up @@ -684,7 +688,7 @@ class NetworkRequestOverviewView extends StatelessWidget {

Widget _buildRow({
required BuildContext context,
required String? title,
required String title,
required Widget child,
}) {
return Row(
Expand All @@ -693,7 +697,7 @@ class NetworkRequestOverviewView extends StatelessWidget {
Container(
width: _keyWidth,
child: SelectableText(
title != null ? '$title: ' : '',
title.isEmpty ? '' : '$title: ',
style: Theme.of(context).textTheme.subtitle2,
),
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,14 @@ class NetworkService {
final sockets = await _refreshSockets();
List<HttpProfileRequest>? httpRequests;
Timeline? timeline;
if (await serviceManager.service!.isDartIoVersionSupported(
final service = serviceManager.service!;
if (await service.isDartIoVersionSupported(
supportedVersion: SemanticVersion(major: 1, minor: 6),
isolateId: serviceManager.isolateManager.selectedIsolate.value!.id!,
)) {
httpRequests = await _refreshHttpProfile();
} else {
timeline = await serviceManager.service!.getVMTimeline(
timeline = await service.getVMTimeline(
timeOriginMicros: networkController.lastRefreshMicros,
timeExtentMicros: timestamp - networkController.lastRefreshMicros,
);
Expand All @@ -64,12 +65,12 @@ class NetworkService {
}

Future<List<HttpProfileRequest>> _refreshHttpProfile() async {
assert(serviceManager.service != null);
if (serviceManager.service == null) return [];
final service = serviceManager.service;
if (service == null) return [];

final requests = <HttpProfileRequest>[];
await serviceManager.service!.forEachIsolate((isolate) async {
final request = await serviceManager.service!.getHttpProfile(
await service.forEachIsolate((isolate) async {
final request = await service.getHttpProfile(
isolate.id!,
updatedSince: networkController.lastRefreshMicros,
);
Expand All @@ -79,9 +80,8 @@ class NetworkService {
}

Future<void> _clearHttpProfile() async {
assert(serviceManager.service != null);
if (serviceManager.service == null) return;
final service = serviceManager.service!;
final service = serviceManager.service;
if (service == null) return;
await service.forEachIsolate((isolate) async {
final future = service.clearHttpProfile(isolate.id!);
// The above call won't complete immediately if the isolate is paused, so
Expand All @@ -94,9 +94,8 @@ class NetworkService {
}

Future<List<SocketStatistic>> _refreshSockets() async {
assert(serviceManager.service != null);
if (serviceManager.service == null) return [];
final service = serviceManager.service!;
final service = serviceManager.service;
if (service == null) return [];
final sockets = <SocketStatistic>[];
await service.forEachIsolate((isolate) async {
final socketProfile = await service.getSocketProfile(isolate.id!);
Expand All @@ -106,9 +105,8 @@ class NetworkService {
}

Future<void> _clearSocketProfile() async {
assert(serviceManager.service != null);
if (serviceManager.service == null) return;
final service = serviceManager.service!;
final service = serviceManager.service;
if (service == null) return;
await service.forEachIsolate((isolate) async {
final isolateId = isolate.id!;
final socketProfilingAvailable =
Expand All @@ -127,9 +125,8 @@ class NetworkService {

/// Enables or disables Socket profiling for all isolates.
Future<void> toggleSocketProfiling(bool state) async {
assert(serviceManager.service != null);
if (serviceManager.service == null) return;
final service = serviceManager.service!;
final service = serviceManager.service;
if (service == null) return;
await service.forEachIsolate((isolate) async {
final isolateId = isolate.id!;
final socketProfilingAvailable =
Expand Down