首页 > 解决方案 > 如何使用 darkTheme 在颤动中更改主题:

问题描述

为了在我的 MaterialApp() 中管理主题,我使用:

MaterialApp(
  ...
  theme: isDarkTheme ? darkTheme() : lightTheme(),
)

darkTheme()并且lightTheme()只是返回的简单函数ThemeData()

因此,我使用继承的 Widget 来更改变量isDarkTheme,然后我使用该setState((){})方法并重建所有应用程序

但是,我在 Flutter 文档中看到我们可以使用darkTheme:.

我正在尝试这样做:

MaterialApp(
  ...
  theme: lightTheme(),
  darkTheme: darkTheme()
)

我们可以在申请过程中更改主题

标签: flutterthemes

解决方案


darkTheme属性用于定义Theme设备进入黑暗模式时使用的属性,因此您不能强制您的应用使用darkTheme属性,因为它取决于MediaQueryData.platformBrightness哪个值是只读字段。

您可以定义几个主题用作Theme属性值,并在应用程序过程中通过使用StreamBuilder包裹在它们之间进行切换MaterialApp,这不会导致应用程序停止和重建,就像您使用setState更改时的情况一样主题(您需要rxdart包来应用以下解决方案):

   //BehaviorSubject stream any changes immediately without explicit call
   var themeSubject = BehaviorSubject<ThemeData>();

   //This way the app won't rebuild when the user selects the same theme
   Stream<ThemeData> getTheme() => themeSubject.stream.distinct(); 

   void setTheme (MaterialColor color){
       pointsSubject.sink.add(ThemeData(primarySwatch: color) ;
   }


   return StreamBuilder<ThemeData>(
             stream: getTheme(),
             initialData: ThemeData(
                primarySwatch: Colors.blue,
                primaryTextTheme: TextTheme(
                  title: TextStyle(color: Colors.white),
                ),
             builder: (context, themeSnapshot){
                 return MaterialApp(theme: themeSnapshot.data);
             }
          ): 

然后使用您InheritedWidget的访问setTheme并随意更改它。


推荐阅读