mirror of
https://github.com/flutter/flutter
synced 2024-10-13 19:52:53 +00:00
Fix bug when tapping ListTitle with CheckboxListTile tristate enable (#63925)
* fix bug when tap ListTitle when tristate enable #63846 * fix bug when tap ListTitle when tristate enable #63846 * code style * improve the unit test case * bow to convention
This commit is contained in:
parent
41e553bbfc
commit
f44f43358f
|
@ -98,7 +98,7 @@ class CupertinoTheme extends StatelessWidget {
|
|||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return _InheritedCupertinoTheme(
|
||||
return _InheritedCupertinoTheme(
|
||||
theme: this,
|
||||
child: IconTheme(
|
||||
data: CupertinoIconThemeData(color: data.primaryColor),
|
||||
|
|
|
@ -382,6 +382,21 @@ class CheckboxListTile extends StatelessWidget {
|
|||
/// If tristate is false (the default), [value] must not be null.
|
||||
final bool tristate;
|
||||
|
||||
void _handleValueChange() {
|
||||
assert(onChanged != null);
|
||||
switch (value) {
|
||||
case false:
|
||||
onChanged(true);
|
||||
break;
|
||||
case true:
|
||||
onChanged(tristate ? null : false);
|
||||
break;
|
||||
default: // case null:
|
||||
onChanged(false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final Widget control = Checkbox(
|
||||
|
@ -416,7 +431,7 @@ class CheckboxListTile extends StatelessWidget {
|
|||
isThreeLine: isThreeLine,
|
||||
dense: dense,
|
||||
enabled: onChanged != null,
|
||||
onTap: onChanged != null ? () { onChanged(!value); } : null,
|
||||
onTap: onChanged != null ? _handleValueChange : null,
|
||||
selected: selected,
|
||||
autofocus: autofocus,
|
||||
contentPadding: contentPadding,
|
||||
|
|
|
@ -277,7 +277,7 @@ class _UnderdampedSolution implements _SpringSolution {
|
|||
final double power = math.pow(math.e, _r * time) as double;
|
||||
final double cosine = math.cos(_w * time);
|
||||
final double sine = math.sin(_w * time);
|
||||
return power * (_c2 * _w * cosine - _c1 * _w * sine) +
|
||||
return power * (_c2 * _w * cosine - _c1 * _w * sine) +
|
||||
_r * power * (_c2 * sine + _c1 * cosine);
|
||||
}
|
||||
|
||||
|
|
|
@ -573,7 +573,7 @@ class _RenderSingleChildViewport extends RenderBox with RenderObjectWithChildMix
|
|||
|
||||
bool _shouldClipAtPaintOffset(Offset paintOffset) {
|
||||
assert(child != null);
|
||||
return paintOffset.dx < 0 ||
|
||||
return paintOffset.dx < 0 ||
|
||||
paintOffset.dy < 0 ||
|
||||
paintOffset.dx + child.size.width > size.width ||
|
||||
paintOffset.dy + child.size.height > size.height;
|
||||
|
|
|
@ -148,7 +148,8 @@ void main() {
|
|||
});
|
||||
|
||||
testWidgets('CheckboxListTile tristate test', (WidgetTester tester) async {
|
||||
bool _value;
|
||||
bool _value = false;
|
||||
bool _tristate = false;
|
||||
|
||||
await tester.pumpWidget(
|
||||
Material(
|
||||
|
@ -157,7 +158,7 @@ void main() {
|
|||
return wrap(
|
||||
child: CheckboxListTile(
|
||||
title: const Text('Title'),
|
||||
tristate: true,
|
||||
tristate: _tristate,
|
||||
value: _value,
|
||||
onChanged: (bool value) {
|
||||
setState(() {
|
||||
|
@ -171,12 +172,33 @@ void main() {
|
|||
),
|
||||
);
|
||||
|
||||
expect(tester.widget<Checkbox>(find.byType(Checkbox)).value, null);
|
||||
expect(tester.widget<Checkbox>(find.byType(Checkbox)).value, false);
|
||||
|
||||
// Tap the checkbox when tristate is disabled.
|
||||
await tester.tap(find.byType(Checkbox));
|
||||
await tester.pumpAndSettle();
|
||||
expect(_value, true);
|
||||
|
||||
await tester.tap(find.byType(Checkbox));
|
||||
await tester.pumpAndSettle();
|
||||
expect(_value, false);
|
||||
|
||||
// Tap the listTile when tristate is disabled.
|
||||
await tester.tap(find.byType(ListTile));
|
||||
await tester.pumpAndSettle();
|
||||
expect(_value, true);
|
||||
|
||||
await tester.tap(find.byType(ListTile));
|
||||
await tester.pumpAndSettle();
|
||||
expect(_value, false);
|
||||
|
||||
// Enable tristate
|
||||
_tristate = true;
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(tester.widget<Checkbox>(find.byType(Checkbox)).value, false);
|
||||
|
||||
// Tap the checkbox when tristate is enabled.
|
||||
await tester.tap(find.byType(Checkbox));
|
||||
await tester.pumpAndSettle();
|
||||
expect(_value, true);
|
||||
|
@ -184,5 +206,22 @@ void main() {
|
|||
await tester.tap(find.byType(Checkbox));
|
||||
await tester.pumpAndSettle();
|
||||
expect(_value, null);
|
||||
|
||||
await tester.tap(find.byType(Checkbox));
|
||||
await tester.pumpAndSettle();
|
||||
expect(_value, false);
|
||||
|
||||
// Tap the listTile when tristate is enabled.
|
||||
await tester.tap(find.byType(ListTile));
|
||||
await tester.pumpAndSettle();
|
||||
expect(_value, true);
|
||||
|
||||
await tester.tap(find.byType(ListTile));
|
||||
await tester.pumpAndSettle();
|
||||
expect(_value, null);
|
||||
|
||||
await tester.tap(find.byType(ListTile));
|
||||
await tester.pumpAndSettle();
|
||||
expect(_value, false);
|
||||
});
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue