Add toggle to allow showing/hiding internal properties (#3006)
diff --git a/case_study/code_size/optimized/code_size_images/test/widget_test.dart b/case_study/code_size/optimized/code_size_images/test/widget_test.dart index d7452ee..ba11e18 100644 --- a/case_study/code_size/optimized/code_size_images/test/widget_test.dart +++ b/case_study/code_size/optimized/code_size_images/test/widget_test.dart
@@ -5,11 +5,10 @@ // gestures. You can also use WidgetTester to find child widgets in the widget // tree, read text, and verify that the values of widget properties are correct. +import 'package:code_size_images/main.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:code_size_images/main.dart'; - void main() { testWidgets('Counter increments smoke test', (WidgetTester tester) async { // Build our app and trigger a frame.
diff --git a/case_study/code_size/optimized/code_size_package/test/widget_test.dart b/case_study/code_size/optimized/code_size_package/test/widget_test.dart index f99312d..5ddbd62 100644 --- a/case_study/code_size/optimized/code_size_package/test/widget_test.dart +++ b/case_study/code_size/optimized/code_size_package/test/widget_test.dart
@@ -5,11 +5,10 @@ // gestures. You can also use WidgetTester to find child widgets in the widget // tree, read text, and verify that the values of widget properties are correct. +import 'package:code_size_package/main.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:code_size_package/main.dart'; - void main() { testWidgets('Counter increments smoke test', (WidgetTester tester) async { // Build our app and trigger a frame.
diff --git a/case_study/code_size/unoptimized/code_size_images/test/widget_test.dart b/case_study/code_size/unoptimized/code_size_images/test/widget_test.dart index d7452ee..ba11e18 100644 --- a/case_study/code_size/unoptimized/code_size_images/test/widget_test.dart +++ b/case_study/code_size/unoptimized/code_size_images/test/widget_test.dart
@@ -5,11 +5,10 @@ // gestures. You can also use WidgetTester to find child widgets in the widget // tree, read text, and verify that the values of widget properties are correct. +import 'package:code_size_images/main.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:code_size_images/main.dart'; - void main() { testWidgets('Counter increments smoke test', (WidgetTester tester) async { // Build our app and trigger a frame.
diff --git a/case_study/code_size/unoptimized/code_size_package/test/widget_test.dart b/case_study/code_size/unoptimized/code_size_package/test/widget_test.dart index f99312d..5ddbd62 100644 --- a/case_study/code_size/unoptimized/code_size_package/test/widget_test.dart +++ b/case_study/code_size/unoptimized/code_size_package/test/widget_test.dart
@@ -5,11 +5,10 @@ // gestures. You can also use WidgetTester to find child widgets in the widget // tree, read text, and verify that the values of widget properties are correct. +import 'package:code_size_package/main.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:code_size_package/main.dart'; - void main() { testWidgets('Counter increments smoke test', (WidgetTester tester) async { // Build our app and trigger a frame.
diff --git a/case_study/platform_channel/lib/channel_demo.dart b/case_study/platform_channel/lib/channel_demo.dart index 1865340..eb96566 100644 --- a/case_study/platform_channel/lib/channel_demo.dart +++ b/case_study/platform_channel/lib/channel_demo.dart
@@ -1,5 +1,5 @@ -import 'package:flutter/services.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; class ChannelDemo extends StatefulWidget {
diff --git a/packages/devtools_app/lib/src/provider/instance_viewer/instance_providers.dart b/packages/devtools_app/lib/src/provider/instance_viewer/instance_providers.dart index 6848e1a..601a466 100644 --- a/packages/devtools_app/lib/src/provider/instance_viewer/instance_providers.dart +++ b/packages/devtools_app/lib/src/provider/instance_viewer/instance_providers.dart
@@ -424,7 +424,7 @@ ownerName: owner.name, ownerUri: owner.library.uri, eval: await ref.watch(libraryEvalProvider(owner.library.uri).future), - isDefinedByDependency: ownerPackageName == appName, + isDefinedByDependency: ownerPackageName != appName, ); }).toList();
diff --git a/packages/devtools_app/lib/src/provider/instance_viewer/instance_viewer.dart b/packages/devtools_app/lib/src/provider/instance_viewer/instance_viewer.dart index 9689bf6..0aa26f1 100644 --- a/packages/devtools_app/lib/src/provider/instance_viewer/instance_viewer.dart +++ b/packages/devtools_app/lib/src/provider/instance_viewer/instance_viewer.dart
@@ -96,9 +96,11 @@ const InstanceViewer({ Key key, this.rootPath, + @required this.showInternalProperties, }) : super(key: key); final InstancePath rootPath; + final bool showInternalProperties; @override _InstanceViewerState createState() => _InstanceViewerState(); @@ -351,6 +353,13 @@ @required InstancePath path, }) sync* { for (final field in instance.fields) { + if (!widget.showInternalProperties && + field.isDefinedByDependency && + field.isPrivate) { + // Hide private properties from classes defined by dependencies + continue; + } + final children = _buildListViewItems( context, watch,
diff --git a/packages/devtools_app/lib/src/provider/provider_screen.dart b/packages/devtools_app/lib/src/provider/provider_screen.dart index 0912d86..4ffe639 100644 --- a/packages/devtools_app/lib/src/provider/provider_screen.dart +++ b/packages/devtools_app/lib/src/provider/provider_screen.dart
@@ -8,6 +8,7 @@ import '../banner_messages.dart'; import '../common_widgets.dart'; +import '../dialogs.dart'; import '../screen.dart'; import '../split.dart'; import './instance_viewer/instance_details.dart'; @@ -39,6 +40,8 @@ ); }); +final _showInternals = StateProvider<bool>((ref) => false); + class ProviderScreen extends Screen { const ProviderScreen() : super.conditional( @@ -82,8 +85,8 @@ child: Column( children: const [ AreaPaneHeader( - title: Text('Providers'), needsTopBorder: false, + title: Text('Providers'), ), Expanded( child: ProviderList(), @@ -95,13 +98,25 @@ child: Column( children: [ AreaPaneHeader( - title: Text(detailsTitleText), needsTopBorder: false, + title: Text(detailsTitleText), + actions: [ + SettingsOutlinedButton( + onPressed: () { + showDialog( + context: context, + builder: (_) => _StateInspectorSettingsDialog(), + ); + }, + tooltip: _StateInspectorSettingsDialog.title, + ), + ], ), if (selectedProviderId != null) Expanded( child: InstanceViewer( rootPath: InstancePath.fromProviderId(selectedProviderId), + showInternalProperties: watch(_showInternals).state, ), ) ], @@ -122,3 +137,44 @@ .build(context), ); } + +class _StateInspectorSettingsDialog extends ConsumerWidget { + static const title = 'State inspector configurations'; + + @override + Widget build(BuildContext context, ScopedReader watch) { + final theme = Theme.of(context); + + return DevToolsDialog( + title: dialogTitleText(theme, title), + content: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + InkWell( + onTap: () => _toggleShowInternals(context), + child: Row( + children: [ + Checkbox( + value: watch(_showInternals).state, + onChanged: (_) => _toggleShowInternals(context), + ), + const Text( + 'Show private properties inherited from SDKs/packages', + ), + ], + ), + ) + ], + ), + actions: [ + DialogCloseButton(), + ], + ); + } + + void _toggleShowInternals(BuildContext context) { + final showInternals = context.read(_showInternals); + showInternals.state = !showInternals.state; + } +}
diff --git a/packages/devtools_app/test/goldens/provider_screen/list_error_banner.png b/packages/devtools_app/test/goldens/provider_screen/list_error_banner.png index 8e4e8fe..f48178e 100644 --- a/packages/devtools_app/test/goldens/provider_screen/list_error_banner.png +++ b/packages/devtools_app/test/goldens/provider_screen/list_error_banner.png Binary files differ
diff --git a/packages/devtools_app/test/goldens/provider_screen/no_selected_provider.png b/packages/devtools_app/test/goldens/provider_screen/no_selected_provider.png index 6fe8dfd..ce95207 100644 --- a/packages/devtools_app/test/goldens/provider_screen/no_selected_provider.png +++ b/packages/devtools_app/test/goldens/provider_screen/no_selected_provider.png Binary files differ
diff --git a/packages/devtools_app/test/goldens/provider_screen/selected_provider.png b/packages/devtools_app/test/goldens/provider_screen/selected_provider.png index 31adc92..a51f89a 100644 --- a/packages/devtools_app/test/goldens/provider_screen/selected_provider.png +++ b/packages/devtools_app/test/goldens/provider_screen/selected_provider.png Binary files differ
diff --git a/packages/devtools_app/test/goldens/provider_screen/selected_provider_error_banner.png b/packages/devtools_app/test/goldens/provider_screen/selected_provider_error_banner.png index 4cb9536..09fc6ab 100644 --- a/packages/devtools_app/test/goldens/provider_screen/selected_provider_error_banner.png +++ b/packages/devtools_app/test/goldens/provider_screen/selected_provider_error_banner.png Binary files differ
diff --git a/packages/devtools_app/test/instance_viewer/instance_viewer_test.dart b/packages/devtools_app/test/instance_viewer/instance_viewer_test.dart index e5b2f15..aae62d7 100644 --- a/packages/devtools_app/test/instance_viewer/instance_viewer_test.dart +++ b/packages/devtools_app/test/instance_viewer/instance_viewer_test.dart
@@ -117,6 +117,99 @@ setUpAll(() => loadFonts()); group('InstanceViewer', () { + testWidgets( + 'showInternalProperties: false hides private properties from dependencies', + (tester) async { + const objPath = InstancePath.fromInstanceId('obj'); + + InstancePath pathForProperty(String name) { + return objPath.pathForChild( + PathToProperty.objectProperty( + name: name, + ownerUri: '', + ownerName: '', + ), + ); + } + + await tester.pumpWidget( + ProviderScope( + overrides: [ + rawInstanceProvider(objPath).overrideWithValue( + AsyncValue.data( + ObjectInstance( + [ + ObjectField( + name: 'first', + isFinal: false, + ownerName: '', + ownerUri: '', + eval: FakeEvalOnDartLibrary(), + ref: Result.error(Error()), + isDefinedByDependency: true, + ), + ObjectField( + name: '_second', + isFinal: false, + ownerName: '', + ownerUri: '', + eval: FakeEvalOnDartLibrary(), + ref: Result.error(Error()), + isDefinedByDependency: true, + ), + ObjectField( + name: 'third', + isFinal: false, + ownerName: '', + ownerUri: '', + eval: FakeEvalOnDartLibrary(), + ref: Result.error(Error()), + isDefinedByDependency: false, + ), + ObjectField( + name: '_forth', + isFinal: false, + ownerName: '', + ownerUri: '', + eval: FakeEvalOnDartLibrary(), + ref: Result.error(Error()), + isDefinedByDependency: false, + ), + ], + hash: 0, + instanceRefId: 'object', + setter: null, + evalForInstance: FakeEvalOnDartLibrary(), + type: 'MyClass', + ), + ), + ), + rawInstanceProvider(pathForProperty('first')) + .overrideWithValue(int42Instance), + rawInstanceProvider(pathForProperty('_second')) + .overrideWithValue(int42Instance), + rawInstanceProvider(pathForProperty('third')) + .overrideWithValue(int42Instance), + rawInstanceProvider(pathForProperty('_forth')) + .overrideWithValue(int42Instance), + ], + child: const MaterialApp( + home: Scaffold( + body: InstanceViewer( + showInternalProperties: false, + rootPath: objPath, + ), + ), + ), + ), + ); + + await expectLater( + find.byType(MaterialApp), + matchesGoldenFile('show_internal_properties.png'), + ); + }); + testWidgets('field editing flow', (tester) async { const objPath = InstancePath.fromInstanceId('obj'); final propertyPath = objPath.pathForChild( @@ -164,7 +257,10 @@ ], child: const MaterialApp( home: Scaffold( - body: InstanceViewer(rootPath: objPath), + body: InstanceViewer( + showInternalProperties: true, + rootPath: objPath, + ), ), ), ), @@ -202,7 +298,10 @@ ], child: const MaterialApp( home: Scaffold( - body: InstanceViewer(rootPath: InstancePath.fromInstanceId('0')), + body: InstanceViewer( + showInternalProperties: true, + rootPath: InstancePath.fromInstanceId('0'), + ), ), ), ), @@ -230,7 +329,10 @@ container: container, child: const MaterialApp( home: Scaffold( - body: InstanceViewer(rootPath: InstancePath.fromInstanceId('0')), + body: InstanceViewer( + showInternalProperties: true, + rootPath: InstancePath.fromInstanceId('0'), + ), ), ), ), @@ -280,7 +382,10 @@ container: container, child: const MaterialApp( home: Scaffold( - body: InstanceViewer(rootPath: InstancePath.fromInstanceId('0')), + body: InstanceViewer( + showInternalProperties: true, + rootPath: InstancePath.fromInstanceId('0'), + ), ), ), ), @@ -327,7 +432,10 @@ container: container, child: const MaterialApp( home: Scaffold( - body: InstanceViewer(rootPath: InstancePath.fromInstanceId('0')), + body: InstanceViewer( + showInternalProperties: true, + rootPath: InstancePath.fromInstanceId('0'), + ), ), ), ), @@ -373,6 +481,7 @@ child: const MaterialApp( home: Scaffold( body: InstanceViewer( + showInternalProperties: true, rootPath: InstancePath.fromInstanceId('enum'), ), ), @@ -401,6 +510,7 @@ child: const MaterialApp( home: Scaffold( body: InstanceViewer( + showInternalProperties: true, rootPath: InstancePath.fromInstanceId('null'), ), ), @@ -429,6 +539,7 @@ child: const MaterialApp( home: Scaffold( body: InstanceViewer( + showInternalProperties: true, rootPath: InstancePath.fromInstanceId('bool'), ), ), @@ -457,6 +568,7 @@ child: const MaterialApp( home: Scaffold( body: InstanceViewer( + showInternalProperties: true, rootPath: InstancePath.fromInstanceId('string'), ), ), @@ -485,6 +597,7 @@ child: const MaterialApp( home: Scaffold( body: InstanceViewer( + showInternalProperties: true, rootPath: InstancePath.fromInstanceId('num'), ), ), @@ -536,6 +649,7 @@ child: const MaterialApp( home: Scaffold( body: InstanceViewer( + showInternalProperties: true, rootPath: InstancePath.fromInstanceId('map'), ), ), @@ -621,6 +735,7 @@ child: const MaterialApp( home: Scaffold( body: InstanceViewer( + showInternalProperties: true, rootPath: InstancePath.fromInstanceId('object'), ), ), @@ -696,6 +811,7 @@ child: const MaterialApp( home: Scaffold( body: InstanceViewer( + showInternalProperties: true, rootPath: InstancePath.fromInstanceId('list'), ), ), @@ -739,6 +855,7 @@ child: const MaterialApp( home: Scaffold( body: InstanceViewer( + showInternalProperties: true, rootPath: InstancePath.fromInstanceId('list2'), ), ),
diff --git a/packages/devtools_app/test/instance_viewer/show_internal_properties.png b/packages/devtools_app/test/instance_viewer/show_internal_properties.png new file mode 100644 index 0000000..4b40b4f --- /dev/null +++ b/packages/devtools_app/test/instance_viewer/show_internal_properties.png Binary files differ
diff --git a/packages/devtools_testing/lib/provider/provider_controller_test.dart b/packages/devtools_testing/lib/provider/provider_controller_test.dart index 148eaed..e7f92a5 100644 --- a/packages/devtools_testing/lib/provider/provider_controller_test.dart +++ b/packages/devtools_testing/lib/provider/provider_controller_test.dart
@@ -278,14 +278,14 @@ .having((e) => e.isFinal, 'isFinal', true) .having((e) => e.isPrivate, 'isPrivate', false) .having((e) => e.isDefinedByDependency, - 'isDefinedByDependency', true), + 'isDefinedByDependency', false), isA<ObjectField>() .having((e) => e.ownerName, 'ownerName', 'Counter') .having((e) => e.name, 'name', '_count') .having((e) => e.isFinal, 'isFinal', false) .having((e) => e.isPrivate, 'isPrivate', true) .having((e) => e.isDefinedByDependency, - 'isDefinedByDependency', true), + 'isDefinedByDependency', false), isA<ObjectField>() .having( (e) => e.ownerName, 'ownerName', 'ChangeNotifier') @@ -293,7 +293,7 @@ .having((e) => e.isFinal, 'isFinal', false) .having((e) => e.isPrivate, 'isPrivate', true) .having((e) => e.isDefinedByDependency, - 'isDefinedByDependency', false), + 'isDefinedByDependency', true), ]), ), ), @@ -309,79 +309,79 @@ .having((e) => e.isFinal, 'isFinal', false) .having((e) => e.isPrivate, 'isPrivate', false) .having((e) => e.isDefinedByDependency, 'isDefinedByDependency', - true), + false), isA<ObjectField>() .having((e) => e.name, 'name', 'enumeration') .having((e) => e.isFinal, 'isFinal', false) .having((e) => e.isPrivate, 'isPrivate', false) .having((e) => e.isDefinedByDependency, 'isDefinedByDependency', - true), + false), isA<ObjectField>() .having((e) => e.name, 'name', 'finalVar') .having((e) => e.isFinal, 'isFinal', true) .having((e) => e.isPrivate, 'isPrivate', false) .having((e) => e.isDefinedByDependency, 'isDefinedByDependency', - true), + false), isA<ObjectField>() .having((e) => e.name, 'name', 'float') .having((e) => e.isFinal, 'isFinal', false) .having((e) => e.isPrivate, 'isPrivate', false) .having((e) => e.isDefinedByDependency, 'isDefinedByDependency', - true), + false), isA<ObjectField>() .having((e) => e.name, 'name', 'integer') .having((e) => e.isFinal, 'isFinal', false) .having((e) => e.isPrivate, 'isPrivate', false) .having((e) => e.isDefinedByDependency, 'isDefinedByDependency', - true), + false), isA<ObjectField>() .having((e) => e.name, 'name', 'lateWithInitializer') .having((e) => e.isFinal, 'isFinal', false) .having((e) => e.isPrivate, 'isPrivate', false) .having((e) => e.isDefinedByDependency, 'isDefinedByDependency', - true), + false), isA<ObjectField>() .having((e) => e.name, 'name', 'list') .having((e) => e.isFinal, 'isFinal', false) .having((e) => e.isPrivate, 'isPrivate', false) .having((e) => e.isDefinedByDependency, 'isDefinedByDependency', - true), + false), isA<ObjectField>() .having((e) => e.name, 'name', 'map') .having((e) => e.isFinal, 'isFinal', false) .having((e) => e.isPrivate, 'isPrivate', false) .having((e) => e.isDefinedByDependency, 'isDefinedByDependency', - true), + false), isA<ObjectField>() .having((e) => e.name, 'name', 'nill') .having((e) => e.isFinal, 'isFinal', false) .having((e) => e.isPrivate, 'isPrivate', false) .having((e) => e.isDefinedByDependency, 'isDefinedByDependency', - true), + false), isA<ObjectField>() .having((e) => e.name, 'name', 'plainInstance') .having((e) => e.isFinal, 'isFinal', false) .having((e) => e.isPrivate, 'isPrivate', false) .having((e) => e.isDefinedByDependency, 'isDefinedByDependency', - true), + false), isA<ObjectField>() .having((e) => e.name, 'name', 'string') .having((e) => e.isFinal, 'isFinal', false) .having((e) => e.isPrivate, 'isPrivate', false) .having((e) => e.isDefinedByDependency, 'isDefinedByDependency', - true), + false), isA<ObjectField>() .having((e) => e.name, 'name', 'uninitializedLate') .having((e) => e.isFinal, 'isFinal', false) .having((e) => e.isPrivate, 'isPrivate', false) .having((e) => e.isDefinedByDependency, 'isDefinedByDependency', - true), + false), isA<ObjectField>() .having((e) => e.name, 'name', '_getterAndSetter') .having((e) => e.isFinal, 'isFinal', false) .having((e) => e.isPrivate, 'isPrivate', true) .having((e) => e.isDefinedByDependency, 'isDefinedByDependency', - true), + false), ]), ); @@ -461,7 +461,7 @@ .having((e) => e.isFinal, 'isFinal', true) .having((e) => e.isPrivate, 'isPrivate', false) .having((e) => e.isDefinedByDependency, 'isDefinedByDependency', - true) + false) ]).having((e) => e.setter, 'setter', isNotNull), ); @@ -502,7 +502,7 @@ .having((e) => e.isFinal, 'isFinal', true) .having((e) => e.isPrivate, 'isPrivate', false) .having((e) => e.isDefinedByDependency, - 'isDefinedByDependency', true) + 'isDefinedByDependency', false) ]), isA<NullInstance>() ]),
diff --git a/packages/devtools_testing/lib/support/fake_inspector_tree.dart b/packages/devtools_testing/lib/support/fake_inspector_tree.dart index 02ac94a..877c94e 100644 --- a/packages/devtools_testing/lib/support/fake_inspector_tree.dart +++ b/packages/devtools_testing/lib/support/fake_inspector_tree.dart
@@ -7,9 +7,9 @@ import 'dart:async'; import 'dart:math'; -import 'package:flutter/material.dart'; import 'package:devtools_app/src/inspector/inspector_tree.dart'; import 'package:devtools_app/src/ui/icons.dart'; +import 'package:flutter/material.dart'; const double fakeRowWidth = 200.0;
diff --git a/tool/lib/commands/generate_changelog.dart b/tool/lib/commands/generate_changelog.dart index 2b4a29c..fef2b97 100644 --- a/tool/lib/commands/generate_changelog.dart +++ b/tool/lib/commands/generate_changelog.dart
@@ -6,9 +6,8 @@ import 'dart:convert' show jsonDecode; import 'dart:io'; -import 'package:http/http.dart' as http; - import 'package:args/command_runner.dart'; +import 'package:http/http.dart' as http; import '../model.dart';