flutter 如何在PreferredSizeWidget getSize方法中访问MediaQuery?

gcmastyq  于 2023-03-13  发布在  Flutter
关注(0)|答案(2)|浏览(118)

我正在编写一个PreferredSizeWidget实现。我的小部件 Package 了一个文本小部件。为了正确计算所需的高度,我需要将文本大小乘以MediaQuery.textScaleFactor。
了解小部件大小的唯一方法是访问父MediaQuery,我没有访问PreferredSizeWidgetSize方法内部的构建上下文。
我怎样才能绕过PreferredSizeWidget的这个限制?

wh6knrhe

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,
  ),
);
bqf10yzr

bqf10yzr2#

简而言之,你不能。
preferredSize getter需要返回一个固定大小,它不能是运行时确定的某个动态值,因为该属性是widget的一部分,而不是elementstate)的一部分,因此您无法在getter中访问BuildContext
有关一些解决方法,请参阅此答案:https://stackoverflow.com/a/62708948/1032613
如果这些解决方法都不能满足您的需要,您可以考虑完全放弃Scaffold(如果你并不真的需要Scaffold)或者,如果你使用其他不错的Scaffold,比如“浮动操作按钮”,你可以考虑去掉ScaffoldappBar属性,并设计自己的自定义应用栏作为Scaffoldbody的一部分,例如,使用一个Column()作为它的主体,并将自己的应用栏放在那里。

相关问题