要在我的MaterialApp()中管理主题,我使用:
MaterialApp(
...
theme: isDarkTheme ? darkTheme() : lightTheme(),
)
darkTheme()
和lightTheme()
只是返回ThemeData()
因此,我使用继承的Widget来更改变量isDarkTheme
,然后使用setState((){})
方法来重新构建所有应用程序
但是,我在Flutter文档中看到我们可以使用darkTheme:
。
我正在尝试这样做:
MaterialApp(
...
theme: lightTheme(),
darkTheme: darkTheme()
)
我们可以在申请过程中更改主题
答案 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
并根据需要进行更改。