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
70aa1227
Unverified
Commit
70aa1227
authored
Oct 26, 2020
by
MH Johnson
Committed by
GitHub
Oct 26, 2020
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[Material] Fix BottomNavTheme.showSelectedLabels bug (#67342)
parent
193fe3e9
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
147 additions
and
29 deletions
+147
-29
bottom_navigation_bar.dart
packages/flutter/lib/src/material/bottom_navigation_bar.dart
+26
-29
bottom_navigation_bar_theme.dart
...flutter/lib/src/material/bottom_navigation_bar_theme.dart
+8
-0
bottom_navigation_bar_theme_test.dart
...utter/test/material/bottom_navigation_bar_theme_test.dart
+113
-0
No files found.
packages/flutter/lib/src/material/bottom_navigation_bar.dart
View file @
70aa1227
...
...
@@ -140,7 +140,7 @@ class BottomNavigationBar extends StatefulWidget {
/// Creates a bottom navigation bar which is typically used as a
/// [Scaffold]'s [Scaffold.bottomNavigationBar] argument.
///
/// The length of [items] must be at least two and each item's icon and
title
/// The length of [items] must be at least two and each item's icon and
label
/// must not be null.
///
/// If [type] is null then [BottomNavigationBarType.fixed] is used when there
...
...
@@ -164,10 +164,14 @@ class BottomNavigationBar extends StatefulWidget {
/// former is preferred, [fixedColor] only exists for the sake of
/// backwards compatibility.
///
/// The [showSelectedLabels] argument must be non-null.
/// If [showSelectedLabels] is `null`, [BottomNavigationBarThemeData.showSelectedLabels]
/// is used. If [BottomNavigationBarThemeData.showSelectedLabels] is null,
/// then [showSelectedLabels] defaults to `true`.
///
/// The [showUnselectedLabels] argument defaults to `true` if [type] is
/// [BottomNavigationBarType.fixed] and `false` if [type] is
/// If [showUnselectedLabels] is `null`, [BottomNavigationBarThemeData.showUnselectedLabels]
/// is used. If [BottomNavigationBarThemeData.showSelectedLabels] is null,
/// then [showUnselectedLabels] defaults to `true` when [type] is
/// [BottomNavigationBarType.fixed] and `false` when [type] is
/// [BottomNavigationBarType.shifting].
BottomNavigationBar
({
Key
?
key
,
...
...
@@ -187,7 +191,7 @@ class BottomNavigationBar extends StatefulWidget {
this
.
unselectedFontSize
=
12.0
,
this
.
selectedLabelStyle
,
this
.
unselectedLabelStyle
,
this
.
showSelectedLabels
=
true
,
this
.
showSelectedLabels
,
this
.
showUnselectedLabels
,
this
.
mouseCursor
,
})
:
assert
(
items
!=
null
),
...
...
@@ -206,7 +210,6 @@ class BottomNavigationBar extends StatefulWidget {
),
assert
(
selectedFontSize
!=
null
&&
selectedFontSize
>=
0.0
),
assert
(
unselectedFontSize
!=
null
&&
unselectedFontSize
>=
0.0
),
assert
(
showSelectedLabels
!=
null
),
selectedItemColor
=
selectedItemColor
??
fixedColor
,
super
(
key:
key
);
...
...
@@ -286,7 +289,7 @@ class BottomNavigationBar extends StatefulWidget {
///
/// It this field is provided, it must contain non-null [IconThemeData.size]
/// and [IconThemeData.color] properties. Also, if this field is supplied,
/// [
un
selectedIconTheme] must be provided.
/// [selectedIconTheme] must be provided.
final
IconThemeData
?
unselectedIconTheme
;
/// The [TextStyle] of the [BottomNavigationBarItem] labels when they are
...
...
@@ -318,7 +321,7 @@ class BottomNavigationBar extends StatefulWidget {
final
bool
?
showUnselectedLabels
;
/// Whether the labels are shown for the selected [BottomNavigationBarItem].
final
bool
showSelectedLabels
;
final
bool
?
showSelectedLabels
;
/// The cursor for a mouse pointer when it enters or is hovering over the
/// tiles.
...
...
@@ -346,8 +349,8 @@ class _BottomNavigationTile extends StatelessWidget {
required
this
.
unselectedLabelStyle
,
required
this
.
selectedIconTheme
,
required
this
.
unselectedIconTheme
,
this
.
showSelectedLabels
,
this
.
showUnselectedLabels
,
required
this
.
showSelectedLabels
,
required
this
.
showUnselectedLabels
,
this
.
indexLabel
,
required
this
.
mouseCursor
,
})
:
assert
(
type
!=
null
),
...
...
@@ -371,8 +374,8 @@ class _BottomNavigationTile extends StatelessWidget {
final
TextStyle
selectedLabelStyle
;
final
TextStyle
unselectedLabelStyle
;
final
String
?
indexLabel
;
final
bool
?
showSelectedLabels
;
final
bool
?
showUnselectedLabels
;
final
bool
showSelectedLabels
;
final
bool
showUnselectedLabels
;
final
MouseCursor
mouseCursor
;
@override
...
...
@@ -383,16 +386,10 @@ class _BottomNavigationTile extends StatelessWidget {
// (which is an integer) by a large number.
final
int
size
;
final
BottomNavigationBarThemeData
bottomTheme
=
BottomNavigationBarTheme
.
of
(
context
);
final
double
selectedFontSize
=
selectedLabelStyle
.
fontSize
!;
final
double
selectedIconSize
=
selectedIconTheme
?.
size
??
bottomTheme
.
selectedIconTheme
?.
size
??
iconSize
;
final
double
unselectedIconSize
=
unselectedIconTheme
?.
size
??
bottomTheme
.
unselectedIconTheme
?.
size
??
iconSize
;
final
double
selectedIconSize
=
selectedIconTheme
?.
size
??
iconSize
;
final
double
unselectedIconSize
=
unselectedIconTheme
?.
size
??
iconSize
;
// The amount that the selected icon is bigger than the unselected icons,
// (or zero if the selected icon is not bigger than the unselected icons).
...
...
@@ -418,9 +415,9 @@ class _BottomNavigationTile extends StatelessWidget {
// | text
// | <-- Padding equal to 1/2 text height + 1/2 unselectedIconDiff.
// =======
final
double
bottomPadding
;
final
double
topPadding
;
if
(
showSelectedLabels
!
&&
!
showUnselectedLabels
!
)
{
double
bottomPadding
;
double
topPadding
;
if
(
showSelectedLabels
&&
!
showUnselectedLabels
)
{
bottomPadding
=
Tween
<
double
>(
begin:
selectedIconDiff
/
2.0
,
end:
selectedFontSize
/
2.0
-
unselectedIconDiff
/
2.0
,
...
...
@@ -429,7 +426,7 @@ class _BottomNavigationTile extends StatelessWidget {
begin:
selectedFontSize
+
selectedIconDiff
/
2.0
,
end:
selectedFontSize
/
2.0
-
unselectedIconDiff
/
2.0
,
).
evaluate
(
animation
);
}
else
if
(!
showSelectedLabels
!
&&
!
showUnselectedLabels
!
)
{
}
else
if
(!
showSelectedLabels
&&
!
showUnselectedLabels
)
{
bottomPadding
=
Tween
<
double
>(
begin:
selectedIconDiff
/
2.0
,
end:
unselectedIconDiff
/
2.0
,
...
...
@@ -474,8 +471,8 @@ class _BottomNavigationTile extends StatelessWidget {
iconSize:
iconSize
,
selected:
selected
,
item:
item
,
selectedIconTheme:
selectedIconTheme
??
bottomTheme
.
selectedIconTheme
,
unselectedIconTheme:
unselectedIconTheme
??
bottomTheme
.
unselectedIconTheme
,
selectedIconTheme:
selectedIconTheme
,
unselectedIconTheme:
unselectedIconTheme
,
),
_Label
(
colorTween:
colorTween
!,
...
...
@@ -483,8 +480,8 @@ class _BottomNavigationTile extends StatelessWidget {
item:
item
,
selectedLabelStyle:
selectedLabelStyle
,
unselectedLabelStyle:
unselectedLabelStyle
,
showSelectedLabels:
showSelectedLabels
??
bottomTheme
.
showUnselectedLabels
!
,
showUnselectedLabels:
showUnselectedLabels
??
bottomTheme
.
showUnselectedLabels
!
,
showSelectedLabels:
showSelectedLabels
,
showUnselectedLabels:
showUnselectedLabels
,
),
],
),
...
...
@@ -894,7 +891,7 @@ class _BottomNavigationBarState extends State<BottomNavigationBar> with TickerPr
colorTween:
colorTween
,
flex:
_evaluateFlex
(
_animations
[
i
]),
selected:
i
==
widget
.
currentIndex
,
showSelectedLabels:
widget
.
showSelectedLabels
,
showSelectedLabels:
widget
.
showSelectedLabels
??
bottomTheme
.
showSelectedLabels
??
true
,
showUnselectedLabels:
widget
.
showUnselectedLabels
??
bottomTheme
.
showUnselectedLabels
??
_defaultShowUnselected
,
indexLabel:
localizations
.
tabLabel
(
tabIndex:
i
+
1
,
tabCount:
widget
.
items
.
length
),
mouseCursor:
effectiveMouseCursor
,
...
...
packages/flutter/lib/src/material/bottom_navigation_bar_theme.dart
View file @
70aa1227
...
...
@@ -58,12 +58,20 @@ class BottomNavigationBarThemeData with Diagnosticable {
/// The size, opacity, and color of the icon in the currently selected
/// [BottomNavigationBarItem.icon].
///
/// If [BottomNavigationBar.selectedIconTheme] is non-null on the widget,
/// the whole [IconThemeData] from the widget will be used over this
/// [selectedIconTheme].
///
/// See [BottomNavigationBar.selectedIconTheme].
final
IconThemeData
?
selectedIconTheme
;
/// The size, opacity, and color of the icon in the currently unselected
/// [BottomNavigationBarItem.icon]s.
///
/// If [BottomNavigationBar.unselectedIconTheme] is non-null on the widget,
/// the whole [IconThemeData] from the widget will be used over this
/// [unselectedIconTheme].
///
/// See [BottomNavigationBar.unselectedIconTheme].
final
IconThemeData
?
unselectedIconTheme
;
...
...
packages/flutter/test/material/bottom_navigation_bar_theme_test.dart
View file @
70aa1227
...
...
@@ -258,6 +258,119 @@ void main() {
expect
(
_material
(
tester
).
elevation
,
equals
(
elevation
));
expect
(
_material
(
tester
).
color
,
equals
(
backgroundColor
));
});
testWidgets
(
'BottomNavigationBarTheme can be used to hide all labels'
,
(
WidgetTester
tester
)
async
{
// Regression test for https://github.com/flutter/flutter/issues/66738.
await
tester
.
pumpWidget
(
MaterialApp
(
theme:
ThemeData
(
bottomNavigationBarTheme:
const
BottomNavigationBarThemeData
(
showSelectedLabels:
false
,
showUnselectedLabels:
false
,
),
),
home:
Scaffold
(
bottomNavigationBar:
BottomNavigationBar
(
items:
const
<
BottomNavigationBarItem
>[
BottomNavigationBarItem
(
icon:
Icon
(
Icons
.
ac_unit
),
label:
'AC'
,
),
BottomNavigationBarItem
(
icon:
Icon
(
Icons
.
access_alarm
),
label:
'Alarm'
,
),
],
),
),
),
);
final
Finder
findOpacity
=
find
.
descendant
(
of:
find
.
byType
(
BottomNavigationBar
),
matching:
find
.
byType
(
Opacity
),
);
expect
(
findOpacity
,
findsNWidgets
(
2
));
expect
(
tester
.
widget
<
Opacity
>(
findOpacity
.
at
(
0
)).
opacity
,
0.0
);
expect
(
tester
.
widget
<
Opacity
>(
findOpacity
.
at
(
1
)).
opacity
,
0.0
);
});
testWidgets
(
'BottomNavigationBarTheme can be used to hide selected labels'
,
(
WidgetTester
tester
)
async
{
// Regression test for https://github.com/flutter/flutter/issues/66738.
await
tester
.
pumpWidget
(
MaterialApp
(
theme:
ThemeData
(
bottomNavigationBarTheme:
const
BottomNavigationBarThemeData
(
showSelectedLabels:
false
,
showUnselectedLabels:
true
,
),
),
home:
Scaffold
(
bottomNavigationBar:
BottomNavigationBar
(
items:
const
<
BottomNavigationBarItem
>[
BottomNavigationBarItem
(
icon:
Icon
(
Icons
.
ac_unit
),
label:
'AC'
,
),
BottomNavigationBarItem
(
icon:
Icon
(
Icons
.
access_alarm
),
label:
'Alarm'
,
),
],
),
),
),
);
final
Finder
findFadeTransition
=
find
.
descendant
(
of:
find
.
byType
(
BottomNavigationBar
),
matching:
find
.
byType
(
FadeTransition
),
);
expect
(
findFadeTransition
,
findsNWidgets
(
2
));
expect
(
tester
.
widget
<
FadeTransition
>(
findFadeTransition
.
at
(
0
)).
opacity
.
value
,
0.0
);
expect
(
tester
.
widget
<
FadeTransition
>(
findFadeTransition
.
at
(
1
)).
opacity
.
value
,
1.0
);
});
testWidgets
(
'BottomNavigationBarTheme can be used to hide unselected labels'
,
(
WidgetTester
tester
)
async
{
await
tester
.
pumpWidget
(
MaterialApp
(
theme:
ThemeData
(
bottomNavigationBarTheme:
const
BottomNavigationBarThemeData
(
showSelectedLabels:
true
,
showUnselectedLabels:
false
,
),
),
home:
Scaffold
(
bottomNavigationBar:
BottomNavigationBar
(
items:
const
<
BottomNavigationBarItem
>[
BottomNavigationBarItem
(
icon:
Icon
(
Icons
.
ac_unit
),
label:
'AC'
,
),
BottomNavigationBarItem
(
icon:
Icon
(
Icons
.
access_alarm
),
label:
'Alarm'
,
),
],
),
),
),
);
final
Finder
findFadeTransition
=
find
.
descendant
(
of:
find
.
byType
(
BottomNavigationBar
),
matching:
find
.
byType
(
FadeTransition
),
);
expect
(
findFadeTransition
,
findsNWidgets
(
2
));
expect
(
tester
.
widget
<
FadeTransition
>(
findFadeTransition
.
at
(
0
)).
opacity
.
value
,
1.0
);
expect
(
tester
.
widget
<
FadeTransition
>(
findFadeTransition
.
at
(
1
)).
opacity
.
value
,
0.0
);
});
}
TextStyle
_iconStyle
(
WidgetTester
tester
,
IconData
icon
)
{
...
...
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