1

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

IconButton(

       icon: Icon(
        Icons.brightness,
        ),
       onPressed: () {
       setState(() {
       // Change to dark theme?
        } else {
       //Change it back to default light theme //How?
  }
}
);

主要.dart

MaterialApp(

  theme: ThemeData(
  ),
  darkTheme: ThemeData(
    brightness: Brightness.dark,
  ),
4

2 回答 2

0

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

  • 主题模式.light
  • ThemeMode.dark
  • ThemeMode.system

现在的问题是如何在按钮单击时更改它?

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

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

为什么这很糟糕?假设您的按钮位于其他位置,而不是 MaterialApp 所在的位置。你走得越深,你就会面临更多的问题。

好方法
概念仍然相同,但您使用状态管理解决方案来处理该问题。您可以使用ProviderBLoCReactiveXStacked或其他任何东西。

我强烈建议您先学习状态管理解决方案。在flutter网站查看官方文档

于 2020-11-07T07:50:30.030 回答
0

首先在您的材料主题中设置为条件(可能是您定义这是在主类中)

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);
                  }),
            ])));
  }
}
于 2020-11-07T07:51:12.887 回答