标题在 flexibleSpaceBar 上显示不正确
Title not displaying correctly on flexibleSpaceBar
我正在尝试显示标题,但如您所见,它显示不正确。
我尝试将 softWrap 设置为 true,但它仍然是一样的。
代码来自flutter contacts_demo gallery
flexibleSpace: FlexibleSpaceBar(
title: const Text('Fantastic Beasts And Where To Find Them'),
background: Stack(
fit: StackFit.expand,
children: <Widget>[
Image.asset(
'people/ali_landscape.png',
package: 'flutter_gallery_assets',
fit: BoxFit.cover,
height: _appBarHeight,
),
// This gradient ensures that the toolbar icons are distinct
// against the background image.
const DecoratedBox(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment(0.0, -1.0),
end: Alignment(0.0, -0.4),
colors: <Color>[Color(0x60000000), Color(0x00000000)],
),
),
),
],
),
),
由于显而易见的原因,标题长度与您设置的字体大小无法在较小的设备上显示在一行中。
您可能想尝试使用 MediaQuery.of(context).size.width
来获取设备宽度并将 header 文本字体大小相应地设置为它的一小部分。在模拟器中尝试查看哪种最适合您的文本长度。
const Text(
'Fantastic Beasts And Where To Find Them',
style: TextStyle(fontSize: MediaQuery.of(context).size.width/ SOME_NUMBER),
),
或者只是根据一些宽度间隔硬编码一些字体大小:
int _getFontSize(BuildContext context) {
int width = MediaQuery.of(context).size.width;
if (width < 300) {
return 10;
} else if (width < 600) {
return 13;
// etc ...
} else {
return 18;
}
}
...
const Text(
'Fantastic Beasts And Where To Find Them',
style: _getFontSize(context),
),
您可以将 ConstrainedBox
与 MediaQuery.of(context).size.width
一起使用
final mediaQuery = MediaQuery.of(context);
final availableWidth = mediaQuery.size.width - 160;
连同
title: ConstrainedBox(
constraints: BoxConstraints(
maxWidth: availableWidth,
),
child: const Text('Fantastic Beasts And Where To Find Them'),
),
我研究了 FlexibleSpaceBar
来源,至少现在我明白发生了什么。事实证明,在展开状态下 title
被放大到其大小的 1.5
,因此它自然会溢出屏幕。当用户向上滚动时,title
会缩小到 1.0
的源大小。以这种大小,它将位于顶部工具栏中。
也许此信息将帮助某人在解决此问题之前基于他们的解决方法。
我想知道为什么我在 ConstraintedBox
中用 maxWidth: MediaQuery.of(context).size.width
包装标题的技巧不起作用。现在我知道了:我必须将这个 maxWidth
除以 1.5
。
另请参阅 Flutter github 问题跟踪器上的 this bug。
感谢 dimsuz 的回答,可以消除 FlexibleSpaceBar
:
中文本的放大
SliverAppBar(
actions: <Widget>[
IconButton(
icon: Icon(Icons.save),
onPressed: () {},
),
],
floating: true,
pinned: false,
snap: false,
flexibleSpace: FlexibleSpaceBar(
title: Text(title, style: TextStyle(fontSize: 20.0 / 1.5)),
centerTitle: false,
background: Container(
color: Theme.of(context).primaryColor,
),
),
expandedHeight: 120,
),
fontSize
中的20.0
我取自here。
我正在尝试显示标题,但如您所见,它显示不正确。
我尝试将 softWrap 设置为 true,但它仍然是一样的。
代码来自flutter contacts_demo gallery
flexibleSpace: FlexibleSpaceBar(
title: const Text('Fantastic Beasts And Where To Find Them'),
background: Stack(
fit: StackFit.expand,
children: <Widget>[
Image.asset(
'people/ali_landscape.png',
package: 'flutter_gallery_assets',
fit: BoxFit.cover,
height: _appBarHeight,
),
// This gradient ensures that the toolbar icons are distinct
// against the background image.
const DecoratedBox(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment(0.0, -1.0),
end: Alignment(0.0, -0.4),
colors: <Color>[Color(0x60000000), Color(0x00000000)],
),
),
),
],
),
),
由于显而易见的原因,标题长度与您设置的字体大小无法在较小的设备上显示在一行中。
您可能想尝试使用 MediaQuery.of(context).size.width
来获取设备宽度并将 header 文本字体大小相应地设置为它的一小部分。在模拟器中尝试查看哪种最适合您的文本长度。
const Text(
'Fantastic Beasts And Where To Find Them',
style: TextStyle(fontSize: MediaQuery.of(context).size.width/ SOME_NUMBER),
),
或者只是根据一些宽度间隔硬编码一些字体大小:
int _getFontSize(BuildContext context) {
int width = MediaQuery.of(context).size.width;
if (width < 300) {
return 10;
} else if (width < 600) {
return 13;
// etc ...
} else {
return 18;
}
}
...
const Text(
'Fantastic Beasts And Where To Find Them',
style: _getFontSize(context),
),
您可以将 ConstrainedBox
与 MediaQuery.of(context).size.width
final mediaQuery = MediaQuery.of(context);
final availableWidth = mediaQuery.size.width - 160;
连同
title: ConstrainedBox(
constraints: BoxConstraints(
maxWidth: availableWidth,
),
child: const Text('Fantastic Beasts And Where To Find Them'),
),
我研究了 FlexibleSpaceBar
来源,至少现在我明白发生了什么。事实证明,在展开状态下 title
被放大到其大小的 1.5
,因此它自然会溢出屏幕。当用户向上滚动时,title
会缩小到 1.0
的源大小。以这种大小,它将位于顶部工具栏中。
也许此信息将帮助某人在解决此问题之前基于他们的解决方法。
我想知道为什么我在 ConstraintedBox
中用 maxWidth: MediaQuery.of(context).size.width
包装标题的技巧不起作用。现在我知道了:我必须将这个 maxWidth
除以 1.5
。
另请参阅 Flutter github 问题跟踪器上的 this bug。
感谢 dimsuz 的回答,可以消除 FlexibleSpaceBar
:
SliverAppBar(
actions: <Widget>[
IconButton(
icon: Icon(Icons.save),
onPressed: () {},
),
],
floating: true,
pinned: false,
snap: false,
flexibleSpace: FlexibleSpaceBar(
title: Text(title, style: TextStyle(fontSize: 20.0 / 1.5)),
centerTitle: false,
background: Container(
color: Theme.of(context).primaryColor,
),
),
expandedHeight: 120,
),
fontSize
中的20.0
我取自here。