Flutter 如何将 onPressed 设置为更改 ThemeData?

3

我想将主题更改为暗色主题,并通过此按钮返回浅色主题:

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

请参考此代码,您将找到解决方案:https://github.com/zubairehman/flutter-boilerplate-project - Ronak Patel
2个回答

1

首先,在你的材料主题中,将"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);
                  }),
            ])));
  }
}

0

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

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

现在的问题是如何通过按钮点击来改变它?

不好的方法
themeMode的值保存在一个变量中,而不是直接设置themeMode。在单击按钮时更改状态,例如:

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

为什么这是不好的?假设你的按钮位于 MaterialApp 的位置之外。你越深入,面临的问题就越多。

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

我强烈建议您首先学习一种状态管理解决方案。请查看 Flutter网站上的官方文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接