【问题标题】:How can I use MediaQuery to build theme?如何使用 MediaQuery 构建主题?
【发布时间】:2020-12-21 23:39:15
【问题描述】:

开始学习 Flutter,所以我在想是否可以创建一个返回 ThemeData 对象的函数,但在这个函数内部我想使用 MediaQuery.of(context)。我的意思是,我知道我可以创建这样的函数,但是如果我在其中使用MediaQuery.of(context),我会出错 (MediaQuery.of() called with a context that does not contain a MediaQuery) 抱怨缺少 MediaQueryProvider。我知道我可以在 MaterialApp 的子元素中使用 MediaQuery,但我现在遇到了设计问题。想象一下:

ThemeData getTheme(BuildContext context) {
  // I wanna be able to call MediaQuery.of(contex) here
  return ThemeData();
}

MaterialApp(
   home: home,
   // the getTheme() must be able to use MediaQuery. It takes a context and returns a ThemeData object
   theme: theme.getTheme(context),
   routes: routes,
)

有办法吗?或事件更好,我应该这样做吗?

感谢您的帮助。

【问题讨论】:

标签: flutter design-patterns


【解决方案1】:

你可以试试这个。

为您的MaterialApphome 创建一个无状态/有状态小部件,并在其中创建您的getTheme 方法。

例子,

homePage extends StatelessWidget{

ThemeData getTheme(BuildContext context) {
  // Call MediaQuery.of(contex) here
  return ThemeData();
}

@override
//build method

}//homePage ends here.

现在,在您的材料应用程序中,简单地调用该方法。

MaterialApp(
   home: homePage(),
  
   theme: homePage().getTheme(context),
   routes: routes,
)

【讨论】:

  • 首先我要感谢你,但很抱歉这对我不起作用。我可以使用以下方法使其工作:1)使用带有子上下文的函数来监听子的构建事件,因此在此函数中,我调用 setState 来分配一个类,该类提交了一个新主题,该主题传递给材料应用程序。可以,但是我真的不喜欢这个设计
【解决方案2】:

欢迎来到兄弟会。 实际上,要调用MediaQuery,您需要用MaterialApp() 包装您的主小部件,这通常在您的main.dart 文件中完成。 这是一个例子:

void main() => runApp(App());

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomePage(),
    );
  }
}

希望对您有所帮助!

【讨论】:

  • 感谢您的帮助,但它确实解决了我的设计问题,我想我会尝试@madhavam-shahi 解决方案,但还是谢谢您
猜你喜欢
  • 2019-12-11
  • 1970-01-01
  • 2018-09-25
  • 2022-10-16
  • 2021-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多