如何使用darkTheme改变背景主题:

时间:2019-08-08 17:09:29

标签: flutter themes

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

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

darkTheme()lightTheme()只是返回ThemeData()

的简单函数

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

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

我正在尝试这样做:

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

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

1 个答案:

答案 0 :(得分:1)

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并根据需要进行更改。