Flutter 如何设置 onPressed 来改变 ThemeData?
Flutter How to set onPressed to change ThemeData?
我想使用此按钮将主题更改为深色主题并return更改为浅色主题:
IconButton(
icon: Icon(
Icons.brightness,
),
onPressed: () {
setState(() {
// Change to dark theme?
} else {
//Change it back to default light theme //How?
}
}
);
Main.dart
MaterialApp(
theme: ThemeData(
),
darkTheme: ThemeData(
brightness: Brightness.dark,
),
您可以使用 themeMode
属性 选择要使用的主题。它具有三个可能的值:
- ThemeMode.light
- ThemeMode.dark
- ThemeMode.system
现在的问题是如何在单击按钮时更改它?
错误的方法
将 themeMode
的值保存在变量中并使用该变量而不是直接设置 themeMode
。单击按钮更改状态,如:
setState((){
themeModeVariable = ThemeMode.dark;
});
为什么这样不好?假设您的按钮位于其他地方,而不是 MaterialApp 所在的位置。越深入,问题越多
好方法
好吧,这个概念仍然是相同的,但是您使用状态管理解决方案来处理该问题。您可以使用 Provider or BLoC or ReactiveX or Stacked 或其他任何东西。
我强烈建议您先学习状态管理解决方案。检查 official docs in flutter website
first 在您的 material 主题中设置为条件
(可能你定义这是在 main class)
import 'dart:async';
import 'package:flutter/material.dart';
StreamController<bool> setTheme = StreamController();
main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return StreamBuilder<bool>(
initialData: true,
stream: setTheme.stream,
builder: (context, snapshot) {
return MaterialApp(
theme: snapshot.data ? ThemeData.light() : ThemeData.dark(),
debugShowCheckedModeBanner: false,
home: Scaffold(
appBar: AppBar(title: Text("Your Theme")),
body: YourButtonPage()));/*Change this name with Your class*/
});
}
}
class YourButtonPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(16.0),
child: Center(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
IconButton(
icon: Icon(
Icons.brightness_low,
size: 21,
),
alignment: Alignment.center,
onPressed: () {
setTheme.add(true);
}),
IconButton(
icon: Icon(
Icons.brightness_1,
size: 21,
),
alignment: Alignment.center,
onPressed: () {
setTheme.add(false);
}),
])));
}
}
我想使用此按钮将主题更改为深色主题并return更改为浅色主题:
IconButton(
icon: Icon(
Icons.brightness,
),
onPressed: () {
setState(() {
// Change to dark theme?
} else {
//Change it back to default light theme //How?
}
}
);
Main.dart
MaterialApp(
theme: ThemeData(
),
darkTheme: ThemeData(
brightness: Brightness.dark,
),
您可以使用 themeMode
属性 选择要使用的主题。它具有三个可能的值:
- ThemeMode.light
- ThemeMode.dark
- ThemeMode.system
现在的问题是如何在单击按钮时更改它?
错误的方法
将 themeMode
的值保存在变量中并使用该变量而不是直接设置 themeMode
。单击按钮更改状态,如:
setState((){
themeModeVariable = ThemeMode.dark;
});
为什么这样不好?假设您的按钮位于其他地方,而不是 MaterialApp 所在的位置。越深入,问题越多
好方法
好吧,这个概念仍然是相同的,但是您使用状态管理解决方案来处理该问题。您可以使用 Provider or BLoC or ReactiveX or Stacked 或其他任何东西。
我强烈建议您先学习状态管理解决方案。检查 official docs in flutter website
first 在您的 material 主题中设置为条件 (可能你定义这是在 main class)
import 'dart:async';
import 'package:flutter/material.dart';
StreamController<bool> setTheme = StreamController();
main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return StreamBuilder<bool>(
initialData: true,
stream: setTheme.stream,
builder: (context, snapshot) {
return MaterialApp(
theme: snapshot.data ? ThemeData.light() : ThemeData.dark(),
debugShowCheckedModeBanner: false,
home: Scaffold(
appBar: AppBar(title: Text("Your Theme")),
body: YourButtonPage()));/*Change this name with Your class*/
});
}
}
class YourButtonPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(16.0),
child: Center(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
IconButton(
icon: Icon(
Icons.brightness_low,
size: 21,
),
alignment: Alignment.center,
onPressed: () {
setTheme.add(true);
}),
IconButton(
icon: Icon(
Icons.brightness_1,
size: 21,
),
alignment: Alignment.center,
onPressed: () {
setTheme.add(false);
}),
])));
}
}