Flutter如何设置onPressed来更改ThemeData?

时间:2020-11-07 07:06:54

标签: flutter flutter-theme

我要使用此按钮将主题更改为深色主题并返回至浅色主题:

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,
  ),

2 个答案:

答案 0 :(得分:0)

您可以使用themeMode属性选择要使用的主题。它具有三个可能的值:

  • ThemeMode.light
  • ThemeMode.dark
  • ThemeMode.system

现在的问题是如何在单击按钮时对其进行更改?

错误的方法
themeMode的值保留在变量中,并使用该变量,而不是直接设置themeMode。单击按钮后,更改状态,如:

setState((){
    themeModeVariable = ThemeMode.dark;
});

这为什么不好?假设您的按钮位于其他位置,而不是MaterialApp所在的位置。您越深入,就会遇到更多的问题。

好的方法
好的概念仍然是一样的,但是您使用状态管理解决方案来解决该问题。您可以使用ProviderBLoCReactiveXStacked或其他任何方法。

我强烈建议您首先学习状态管理解决方案。检查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);
                  }),
            ])));
  }
}