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);
                  }),
            ])));
  }
}