我要使用此按钮将主题更改为深色主题并返回至浅色主题:
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,
),
答案 0 :(得分:0)
您可以使用themeMode
属性选择要使用的主题。它具有三个可能的值:
现在的问题是如何在单击按钮时对其进行更改?
错误的方法
将themeMode
的值保留在变量中,并使用该变量,而不是直接设置themeMode
。单击按钮后,更改状态,如:
setState((){
themeModeVariable = ThemeMode.dark;
});
这为什么不好?假设您的按钮位于其他位置,而不是MaterialApp所在的位置。您越深入,就会遇到更多的问题。
好的方法
好的概念仍然是一样的,但是您使用状态管理解决方案来解决该问题。您可以使用Provider或BLoC或ReactiveX或Stacked或其他任何方法。
我强烈建议您首先学习状态管理解决方案。检查official docs in flutter website
答案 1 :(得分:0)
first设置为您的主题的条件 (也许您在主类中定义了它)
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);
}),
])));
}
}