Flutter:如何在运行时更改主题亮度?

标签 flutter material-design

我有一个 MaterialApp,其 ThemeData 最初设置为 Brightness.light。我想在运行时将亮度切换为 Brightness.dark,但是当我进行更改时,只有状态栏会发生变化——Flutter 小部件实际上都没有改变它们的亮度。

如何实现这种行为?

为了在运行时更改 ThemeData,我创建了以下 StatefulWidget 来包装我的 MaterialApp 并在主题更改时重新构建它:

final ThemeData appTheme = ThemeData(
  brightness: Brightness.light,
);

class ThemeChanger extends StatefulWidget {
  static ThemeChangerState of (BuildContext context) {
    return context.ancestorStateOfType(TypeMatcher<ThemeChangerState>());
  }

  ThemeChanger({
    this.childBuilder,
  });

  final Widget Function(BuildContext, ThemeData) childBuilder;

  @override
  ThemeChangerState createState() => ThemeChangerState();
}

class ThemeChangerState extends State<ThemeChanger> {
  Brightness _brightness = Brightness.light;

  set brightness(Brightness brightness) {
    setState(() {
      _brightness = brightness;
    });
  }

  @override
  Widget build(BuildContext context) {
    return widget.childBuilder(
      context,
      appTheme.copyWith(
        brightness: _brightness
      ),
    );
  }
}

// Then in main.dart
void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return DemoTheme(
      childBuilder: (BuildContext context, ThemeData theme) {
        return MaterialApp(
          title: 'Materially Better',
          theme: theme,
          routes: {
            '/': (BuildContext context) {
              return LoginScreen();
            },
            'home': (BuildContext context) {
              return MainScreen();
            }
          },
          debugShowCheckedModeBanner: false,
        );
      },
    );
  }
}

最佳答案

问题是 ThemeData 在构造函数中使用它的 brightness 值来合成许多其他颜色,但是当 ThemeData 时不会重新计算这些颜色 发生了变异。因此,解决方案是实例化一个全新的ThemeData,而不是使用appTheme.copyWith(...)

改变这个:

appTheme.copyWith(
  brightness: _brightness,
),

到这里:

ThemeData(
  brightness: _brightness,
),

关于Flutter:如何在运行时更改主题亮度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54139924/

相关文章:

android - 颜色旁边的数字是什么意思?

javascript - Material Design md-datepicker 在页面加载时自动打开

Flutter,如何在 BarChart 小部件中创建可点击的栏?

android-studio - 带有 Flutter 更新的 Android Studio 导致了索引循环

RangeSlider 上的 Flutter RangeLabels 不起作用

ios - Flutter 'Error running pod install' 'Pods-Runner' 目标具有传递依赖

android - Android 的 Material 组件 slider 有两个大拇指?

flutter - 无法加载 Assets : error when loading an . mp3 文件 Flutter

android - Eclipse Isse 中的 Material 抽屉

android - 更改 Android 上的导航栏图标颜色