我正在编写一个PreferredSizeWidget实现。我的小部件 Package 了一个文本小部件。为了正确计算所需的高度,我需要将文本大小乘以MediaQuery.textScaleFactor。了解小部件大小的唯一方法是访问父MediaQuery,我没有访问PreferredSizeWidgetSize方法内部的构建上下文。我怎样才能绕过PreferredSizeWidget的这个限制?
wh6knrhe1#
你可以在构造函数中传递textscale因子(如@Scorb所述),如下所示:
class AppHeader extends StatelessWidget implements PreferredSizeWidget { final double textScaleFactor; const AppHeader({ super.key, this.textScaleFactor = 1.0, }); @override Widget build(BuildContext context) { ... } @override Size get preferredSize => Size.fromHeight( 80 + (textScaleFactor * 40), ); }
像这样使用它:
Scaffold( appBar: AppHeader( textScaleFactor: MediaQuery.of(context).textScaleFactor, ), );
bqf10yzr2#
简而言之,你不能。preferredSize getter需要返回一个固定大小,它不能是运行时确定的某个动态值,因为该属性是widget的一部分,而不是element(state)的一部分,因此您无法在getter中访问BuildContext。有关一些解决方法,请参阅此答案:https://stackoverflow.com/a/62708948/1032613如果这些解决方法都不能满足您的需要,您可以考虑完全放弃Scaffold(如果你并不真的需要Scaffold)或者,如果你使用其他不错的Scaffold,比如“浮动操作按钮”,你可以考虑去掉Scaffold的appBar属性,并设计自己的自定义应用栏作为Scaffold的body的一部分,例如,使用一个Column()作为它的主体,并将自己的应用栏放在那里。
preferredSize
widget
element
state
BuildContext
Scaffold
appBar
body
Column()
2条答案
按热度按时间wh6knrhe1#
你可以在构造函数中传递textscale因子(如@Scorb所述),如下所示:
像这样使用它:
bqf10yzr2#
简而言之,你不能。
preferredSize
getter需要返回一个固定大小,它不能是运行时确定的某个动态值,因为该属性是widget
的一部分,而不是element
(state
)的一部分,因此您无法在getter中访问BuildContext
。有关一些解决方法,请参阅此答案:https://stackoverflow.com/a/62708948/1032613
如果这些解决方法都不能满足您的需要,您可以考虑完全放弃
Scaffold
(如果你并不真的需要Scaffold
)或者,如果你使用其他不错的Scaffold
,比如“浮动操作按钮”,你可以考虑去掉Scaffold
的appBar
属性,并设计自己的自定义应用栏作为Scaffold
的body
的一部分,例如,使用一个Column()
作为它的主体,并将自己的应用栏放在那里。