use RadioListTile in expansion panels demo (#20240)
* use RadioListTile in expansion panels demo
Fixes #6048.
- expose `_Location`
- appease analyzer
diff --git a/examples/flutter_gallery/lib/demo/material/expansion_panels_demo.dart b/examples/flutter_gallery/lib/demo/material/expansion_panels_demo.dart
index c3f2b86..1eb7b62 100644
--- a/examples/flutter_gallery/lib/demo/material/expansion_panels_demo.dart
+++ b/examples/flutter_gallery/lib/demo/material/expansion_panels_demo.dart
@@ -6,7 +6,8 @@
import '../../gallery/demo.dart';
-enum _Location {
+@visibleForTesting
+enum Location {
Barbados,
Bahamas,
Bermuda
@@ -225,12 +226,12 @@
);
},
),
- DemoItem<_Location>(
+ DemoItem<Location>(
name: 'Location',
- value: _Location.Bahamas,
+ value: Location.Bahamas,
hint: 'Select location',
- valueToString: (_Location location) => location.toString().split('.')[1],
- builder: (DemoItem<_Location> item) {
+ valueToString: (Location location) => location.toString().split('.')[1],
+ builder: (DemoItem<Location> item) {
void close() {
setState(() {
item.isExpanded = false;
@@ -242,47 +243,32 @@
return CollapsibleBody(
onSave: () { Form.of(context).save(); close(); },
onCancel: () { Form.of(context).reset(); close(); },
- child: FormField<_Location>(
+ child: FormField<Location>(
initialValue: item.value,
- onSaved: (_Location result) { item.value = result; },
- builder: (FormFieldState<_Location> field) {
+ onSaved: (Location result) { item.value = result; },
+ builder: (FormFieldState<Location> field) {
return Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
- Row(
- mainAxisSize: MainAxisSize.min,
- children: <Widget>[
- Radio<_Location>(
- value: _Location.Bahamas,
- groupValue: field.value,
- onChanged: field.didChange,
- ),
- const Text('Bahamas')
- ]
+ RadioListTile<Location>(
+ value: Location.Bahamas,
+ title: const Text('Bahamas'),
+ groupValue: field.value,
+ onChanged: field.didChange,
),
- Row(
- mainAxisSize: MainAxisSize.min,
- children: <Widget>[
- Radio<_Location>(
- value: _Location.Barbados,
- groupValue: field.value,
- onChanged: field.didChange,
- ),
- const Text('Barbados')
- ]
+ RadioListTile<Location>(
+ value: Location.Barbados,
+ title: const Text('Barbados'),
+ groupValue: field.value,
+ onChanged: field.didChange,
),
- Row(
- mainAxisSize: MainAxisSize.min,
- children: <Widget>[
- Radio<_Location>(
- value: _Location.Bermuda,
- groupValue: field.value,
- onChanged: field.didChange,
- ),
- const Text('Bermuda')
- ]
- )
+ RadioListTile<Location>(
+ value: Location.Bermuda,
+ title: const Text('Bermuda'),
+ groupValue: field.value,
+ onChanged: field.didChange,
+ ),
]
);
}
diff --git a/examples/flutter_gallery/test/demo/material/expansion_panels_demo_test.dart b/examples/flutter_gallery/test/demo/material/expansion_panels_demo_test.dart
new file mode 100644
index 0000000..29c940b
--- /dev/null
+++ b/examples/flutter_gallery/test/demo/material/expansion_panels_demo_test.dart
@@ -0,0 +1,54 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:flutter/material.dart';
+import 'package:flutter_gallery/demo/material/expansion_panels_demo.dart';
+import 'package:flutter_test/flutter_test.dart';
+
+Future<void> main() async {
+ testWidgets('Expansion panel demo: radio tile selection changes on tap',
+ (WidgetTester tester) async {
+ await tester.pumpWidget(MaterialApp(home: ExpansionPanelsDemo()));
+
+ expect(_expandIcons, findsNWidgets(3));
+
+ await tester.tap(find.byWidget(_radioPanelExpandIcon));
+ await tester.pumpAndSettle();
+
+ expect(_radioFinder, findsNWidgets(3));
+
+ const int i = 1;
+
+ expect(_isRadioSelected(0), isTrue);
+ expect(_isRadioSelected(i), isFalse);
+
+ await tester.tap(find.byWidget(_radioListTiles[i]));
+ await tester.pumpAndSettle();
+
+ expect(_isRadioSelected(0), isFalse);
+ expect(_isRadioSelected(i), isTrue);
+ });
+}
+
+Finder get _expandIcons => find.byType(ExpandIcon);
+
+Widget get _radioPanelExpandIcon => _expandIcons.evaluate().toList()[1].widget;
+
+bool _isRadioSelected(int index) =>
+ _radios[index].value == _radios[index].groupValue;
+
+List<Radio<Location>> get _radios => List<Radio<Location>>.from(
+ _radioFinder.evaluate().map<Widget>((Element e) => e.widget));
+
+// [find.byType] and [find.widgetWithText] do not match subclasses; `Radio` is not sufficient to find a `Radio<_Location>`.
+// Another approach is to grab the `runtimeType` of a dummy instance; see packages/flutter/test/material/control_list_tile_test.dart.
+Finder get _radioFinder =>
+ find.byWidgetPredicate((Widget w) => w is Radio<Location>);
+
+List<RadioListTile<Location>> get _radioListTiles =>
+ List<RadioListTile<Location>>.from(
+ _radioListTilesFinder.evaluate().map<Widget>((Element e) => e.widget));
+
+Finder get _radioListTilesFinder =>
+ find.byWidgetPredicate((Widget w) => w is RadioListTile<Location>);