Commit 13684e4f authored by mockturtl's avatar mockturtl Committed by jslavitz

use RadioListTile in expansion panels demo (#20240)

* use RadioListTile in expansion panels demo

Fixes #6048.
- expose `_Location`
- appease analyzer
parent d89604d8
...@@ -6,7 +6,8 @@ import 'package:flutter/material.dart'; ...@@ -6,7 +6,8 @@ import 'package:flutter/material.dart';
import '../../gallery/demo.dart'; import '../../gallery/demo.dart';
enum _Location { @visibleForTesting
enum Location {
Barbados, Barbados,
Bahamas, Bahamas,
Bermuda Bermuda
...@@ -225,12 +226,12 @@ class _ExpansionPanelsDemoState extends State<ExpansionPanelsDemo> { ...@@ -225,12 +226,12 @@ class _ExpansionPanelsDemoState extends State<ExpansionPanelsDemo> {
); );
}, },
), ),
DemoItem<_Location>( DemoItem<Location>(
name: 'Location', name: 'Location',
value: _Location.Bahamas, value: Location.Bahamas,
hint: 'Select location', hint: 'Select location',
valueToString: (_Location location) => location.toString().split('.')[1], valueToString: (Location location) => location.toString().split('.')[1],
builder: (DemoItem<_Location> item) { builder: (DemoItem<Location> item) {
void close() { void close() {
setState(() { setState(() {
item.isExpanded = false; item.isExpanded = false;
...@@ -242,47 +243,32 @@ class _ExpansionPanelsDemoState extends State<ExpansionPanelsDemo> { ...@@ -242,47 +243,32 @@ class _ExpansionPanelsDemoState extends State<ExpansionPanelsDemo> {
return CollapsibleBody( return CollapsibleBody(
onSave: () { Form.of(context).save(); close(); }, onSave: () { Form.of(context).save(); close(); },
onCancel: () { Form.of(context).reset(); close(); }, onCancel: () { Form.of(context).reset(); close(); },
child: FormField<_Location>( child: FormField<Location>(
initialValue: item.value, initialValue: item.value,
onSaved: (_Location result) { item.value = result; }, onSaved: (Location result) { item.value = result; },
builder: (FormFieldState<_Location> field) { builder: (FormFieldState<Location> field) {
return Column( return Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[ children: <Widget>[
Row( RadioListTile<Location>(
mainAxisSize: MainAxisSize.min, value: Location.Bahamas,
children: <Widget>[ title: const Text('Bahamas'),
Radio<_Location>(
value: _Location.Bahamas,
groupValue: field.value, groupValue: field.value,
onChanged: field.didChange, onChanged: field.didChange,
), ),
const Text('Bahamas') RadioListTile<Location>(
] value: Location.Barbados,
), title: const Text('Barbados'),
Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Radio<_Location>(
value: _Location.Barbados,
groupValue: field.value, groupValue: field.value,
onChanged: field.didChange, onChanged: field.didChange,
), ),
const Text('Barbados') RadioListTile<Location>(
] value: Location.Bermuda,
), title: const Text('Bermuda'),
Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Radio<_Location>(
value: _Location.Bermuda,
groupValue: field.value, groupValue: field.value,
onChanged: field.didChange, onChanged: field.didChange,
), ),
const Text('Bermuda')
]
)
] ]
); );
} }
......
// 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>);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment