Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
F
Front-End
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
abdullh.alsoleman
Front-End
Commits
0c871b85
Unverified
Commit
0c871b85
authored
May 01, 2019
by
Shi-Hao Hong
Committed by
GitHub
May 01, 2019
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Improve RadioListTile Callback Behavior Consistency (#31574)
parent
be75fb36
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
168 additions
and
13 deletions
+168
-13
radio_list_tile.dart
packages/flutter/lib/src/material/radio_list_tile.dart
+1
-1
control_list_tile_test.dart
packages/flutter/test/material/control_list_tile_test.dart
+167
-12
No files found.
packages/flutter/lib/src/material/radio_list_tile.dart
View file @
0c871b85
...
...
@@ -231,7 +231,7 @@ class RadioListTile<T> extends StatelessWidget {
isThreeLine:
isThreeLine
,
dense:
dense
,
enabled:
onChanged
!=
null
,
onTap:
onChanged
!=
null
?
()
{
onChanged
(
value
);
}
:
null
,
onTap:
onChanged
!=
null
&&
!
checked
?
()
{
onChanged
(
value
);
}
:
null
,
selected:
selected
,
),
),
...
...
packages/flutter/test/material/control_list_tile_test.dart
View file @
0c871b85
...
...
@@ -34,20 +34,175 @@ void main() {
expect
(
log
,
equals
(<
dynamic
>[
false
,
'-'
,
false
]));
});
testWidgets
(
'RadioListTile control test'
,
(
WidgetTester
tester
)
async
{
testWidgets
(
'RadioListTile should initialize according to groupValue'
,
(
WidgetTester
tester
)
async
{
final
List
<
int
>
values
=
<
int
>[
0
,
1
,
2
];
int
selectedValue
;
// Constructor parameters are required for [RadioListTile], but they are
// irrelevant when searching with [find.byType].
final
Type
radioListTileType
=
const
RadioListTile
<
int
>(
value:
0
,
groupValue:
0
,
onChanged:
null
,
).
runtimeType
;
List
<
RadioListTile
<
int
>>
generatedRadioListTiles
;
List
<
RadioListTile
<
int
>>
findTiles
()
=>
find
.
byType
(
radioListTileType
)
.
evaluate
()
.
map
<
RadioListTile
<
int
>>((
Element
element
)
=>
element
.
widget
)
.
toList
();
Widget
buildFrame
()
{
return
wrap
(
child:
StatefulBuilder
(
builder:
(
BuildContext
context
,
StateSetter
setState
)
{
return
Scaffold
(
body:
ListView
.
builder
(
itemCount:
values
.
length
,
itemBuilder:
(
BuildContext
context
,
int
index
)
=>
RadioListTile
<
int
>(
onChanged:
(
int
value
)
{
setState
(()
{
selectedValue
=
value
;
});
},
value:
values
[
index
],
groupValue:
selectedValue
,
title:
Text
(
values
[
index
].
toString
()),
),
),
);
},
),
);
}
await
tester
.
pumpWidget
(
buildFrame
());
generatedRadioListTiles
=
findTiles
();
expect
(
generatedRadioListTiles
[
0
].
checked
,
equals
(
false
));
expect
(
generatedRadioListTiles
[
1
].
checked
,
equals
(
false
));
expect
(
generatedRadioListTiles
[
2
].
checked
,
equals
(
false
));
selectedValue
=
1
;
await
tester
.
pumpWidget
(
buildFrame
());
generatedRadioListTiles
=
findTiles
();
expect
(
generatedRadioListTiles
[
0
].
checked
,
equals
(
false
));
expect
(
generatedRadioListTiles
[
1
].
checked
,
equals
(
true
));
expect
(
generatedRadioListTiles
[
2
].
checked
,
equals
(
false
));
});
testWidgets
(
'RadioListTile control tests'
,
(
WidgetTester
tester
)
async
{
final
List
<
int
>
values
=
<
int
>[
0
,
1
,
2
];
int
selectedValue
;
// Constructor parameters are required for [Radio], but they are irrelevant
// when searching with [find.byType].
final
Type
radioType
=
const
Radio
<
int
>(
value:
0
,
groupValue:
0
,
onChanged:
null
,
).
runtimeType
;
final
List
<
dynamic
>
log
=
<
dynamic
>[];
await
tester
.
pumpWidget
(
wrap
(
child:
RadioListTile
<
bool
>(
value:
true
,
groupValue:
false
,
onChanged:
(
bool
value
)
{
log
.
add
(
value
);
},
title:
const
Text
(
'Hello'
),
),
));
await
tester
.
tap
(
find
.
text
(
'Hello'
));
Widget
buildFrame
()
{
return
wrap
(
child:
StatefulBuilder
(
builder:
(
BuildContext
context
,
StateSetter
setState
)
{
return
Scaffold
(
body:
ListView
.
builder
(
itemCount:
values
.
length
,
itemBuilder:
(
BuildContext
context
,
int
index
)
=>
RadioListTile
<
int
>(
onChanged:
(
int
value
)
{
log
.
add
(
value
);
setState
(()
{
selectedValue
=
value
;
});
},
value:
values
[
index
],
groupValue:
selectedValue
,
title:
Text
(
values
[
index
].
toString
()),
),
),
);
},
),
);
}
// Tests for tapping between [Radio] and [ListTile]
await
tester
.
pumpWidget
(
buildFrame
());
await
tester
.
tap
(
find
.
text
(
'1'
));
log
.
add
(
'-'
);
await
tester
.
tap
(
find
.
byType
(
radioType
).
at
(
2
));
expect
(
log
,
equals
(<
dynamic
>[
1
,
'-'
,
2
]));
log
.
add
(
'-'
);
await
tester
.
tap
(
find
.
text
(
'1'
));
log
.
clear
();
selectedValue
=
null
;
// Tests for tapping across [Radio]s exclusively
await
tester
.
pumpWidget
(
buildFrame
());
await
tester
.
tap
(
find
.
byType
(
radioType
).
at
(
1
));
log
.
add
(
'-'
);
await
tester
.
tap
(
find
.
byType
(
radioType
).
at
(
2
));
expect
(
log
,
equals
(<
dynamic
>[
1
,
'-'
,
2
]));
log
.
clear
();
selectedValue
=
null
;
// Tests for tapping across [ListTile]s exclusively
await
tester
.
pumpWidget
(
buildFrame
());
await
tester
.
tap
(
find
.
text
(
'1'
));
log
.
add
(
'-'
);
await
tester
.
tap
(
find
.
byType
(
const
Radio
<
bool
>(
value:
false
,
groupValue:
false
,
onChanged:
null
).
runtimeType
));
expect
(
log
,
equals
(<
dynamic
>[
true
,
'-'
,
true
]));
await
tester
.
tap
(
find
.
text
(
'2'
));
expect
(
log
,
equals
(<
dynamic
>[
1
,
'-'
,
2
]));
});
testWidgets
(
'Selected RadioListTile should not trigger onChanged'
,
(
WidgetTester
tester
)
async
{
// Regression test for https://github.com/flutter/flutter/issues/30311
final
List
<
int
>
values
=
<
int
>[
0
,
1
,
2
];
int
selectedValue
;
// Constructor parameters are required for [Radio], but they are irrelevant
// when searching with [find.byType].
final
Type
radioType
=
const
Radio
<
int
>(
value:
0
,
groupValue:
0
,
onChanged:
null
,
).
runtimeType
;
final
List
<
dynamic
>
log
=
<
dynamic
>[];
Widget
buildFrame
()
{
return
wrap
(
child:
StatefulBuilder
(
builder:
(
BuildContext
context
,
StateSetter
setState
)
{
return
Scaffold
(
body:
ListView
.
builder
(
itemCount:
values
.
length
,
itemBuilder:
(
BuildContext
context
,
int
index
)
=>
RadioListTile
<
int
>(
onChanged:
(
int
value
)
{
log
.
add
(
value
);
setState
(()
{
selectedValue
=
value
;
});
},
value:
values
[
index
],
groupValue:
selectedValue
,
title:
Text
(
values
[
index
].
toString
()),
),
),
);
},
),
);
}
await
tester
.
pumpWidget
(
buildFrame
());
await
tester
.
tap
(
find
.
text
(
'0'
));
await
tester
.
pump
();
expect
(
log
,
equals
(<
int
>[
0
]));
await
tester
.
tap
(
find
.
text
(
'0'
));
expect
(
log
,
equals
(<
int
>[
0
]));
await
tester
.
tap
(
find
.
byType
(
radioType
).
at
(
0
));
await
tester
.
pump
();
expect
(
log
,
equals
(<
int
>[
0
]));
});
testWidgets
(
'SwitchListTile control test'
,
(
WidgetTester
tester
)
async
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment