定制不同风格的App主题

1,266 阅读3分钟

定制不同风格的App主题

主题一般由 颜色、图片、字体、字号资源组成;现在越来越多APP都支持了黑夜主题,还有一些APP支持切换主题。所谓的切换主题就是在不同场景下,更新这些资源和配置。

Android 通过把配置信息则写入各个 style中,通过 activity 的 setTheme 进行切换主题;在Flutter 中则是通过ThemeData 来统一管理主题的配置信息。

ThemeData 涵盖了 Material Design 规范的可自定义部分样式,比如应用明暗模式 brightness、应用主色调 primaryColor、应用次级色调 accentColor、文本字体 fontFamily、输入框光标颜色 cursorColor 等。如果你想深入了解 ThemeData 的其他 API 参数,可以参考官方文档ThemeData

定制全局的布局风格

在APP开发中,我们都知道首先要 指定主题的风格,包括 App 的主题色、字体等,在Flutter 中可以通过 MaterialApp widget 下的 theme来设置。

// 改变一下主题
class ThemeDemo2 extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
          brightness: Brightness.dark, // 改变主题为深色
          primaryColor: Colors.cyan, //修改主色调为青色
          iconTheme: IconThemeData(color: Colors.red), // 按钮主题的颜色,改成了红色
          textTheme: TextTheme(
              bodyText2: TextStyle(color: Colors.deepPurple)) // 文字的颜色改成了紫色
      ),
      home: Home1(title: "改变主题颜色",),
    );
  }
}

我们可以对比一下,更改主题前后的区别:

image.png 可以看到,修改的主题为深色模式,主色调为青色了、按钮的主题颜色也修改了,还有文本的颜色也改了。看起来还是挺简单的。

主题的复用

有时候我们想复用主题的颜色、字体样式,改怎么办呢?

通过Theme.of(context) 方法,取出对应的属性,然后使用到对应的地方。Theme.of(context)获取的父容器的主题样式。

为不同的平台定制不同的主题

有时候在开发中,我们需要为不同的平台配置不同的主题,这时候怎么办呢?

我们可以根据 defaultTargetPlatform 来判断当前应用所运行的平台,从而根据系统类型来设置对应的主题。以后有需要区分当前是哪个平台,都可以使用 defaultTargetPlatform 来完成判断。

class ThemeDemo4 extends StatelessWidget {
// iOS亮色主题
  final ThemeData kIOSTheme = ThemeData(
      brightness: Brightness.light,
      //亮色主题
      accentColor: Colors.white,
      //(按钮)Widget前景色为白色
      primaryColor: Colors.blue,
      //主题色为蓝色
      iconTheme: IconThemeData(color: Colors.grey),
      //icon主题为灰色
      textTheme: TextTheme(bodyText2: TextStyle(color: Colors.black)) //文本主题为黑色
      );

// Android深色主题
  final ThemeData kAndroidTheme = ThemeData(
      brightness: Brightness.dark,
      //深色主题
      accentColor: Colors.black,
      //(按钮)Widget前景色为黑色
      primaryColor: Colors.cyan,
      //主题色Wie青色
      iconTheme: IconThemeData(color: Colors.blue),
      //icon主题色为蓝色
      textTheme: TextTheme(bodyText2: TextStyle(color: Colors.red)) //文本主题色为红色
      );

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: defaultTargetPlatform == TargetPlatform.android
          ? kAndroidTheme
          : kIOSTheme,
      home: Home1(
        title: "不同平台,不同主题",
      ),
    );
  }
}

image.png

总结

通过对 主题 的学习,了解到了 如何去定制一个主题,指定 是亮色还是暗色模式、字体样式、主色调等;然后通过 Theme.of(context) 方法拿到父widget 的主题,再获取到对应的属性进行复用;最后 通过 defaultTargetPlatform 获取到当前运行的平台,为不同的平台 设置不同的主题,完成了根据平台,展示不同主题。