Flutter微框架Nylo(十二):主题和样式

443 阅读5分钟

您可以使用主题来管理应用程序的用户界面风格。通过主题,我们可以改变文本的字体大小、按钮的显示方式以及应用程序的整体外观。

如果您是主题方面的新手,Flutter 网站上的示例可以帮助您入门。

开箱即用的 Nylo 包括预配置的浅色模式和深色模式主题。

如果设备进入 "浅色/深色 "模式,主题也会更新。

浅色与深色主题

浅色主题 - lib/resources/themes/light_theme.dart

深色主题 - lib/resources/themes/dark_theme.dart

在这些文件中,您将找到预定义的主题数据和主题样式。

创建主题

如果你想为你的应用程序设置多个主题,我们有一个简单的方法。如果你是主题方面的新手,请跟我们学习。

首先,从终端运行以下命令:

dart run nylo_framework:main make:theme bright_theme

注意:将bright_theme替换为新主题的名称。

这会在 /resources/themes/ 目录中创建一个新主题,并在 /resources/themes/styles/ 目录中创建一个主题颜色文件。

您可以在 /resources/themes/styles/bright_theme_colors.dart 文件中修改新主题的颜色。

准备好使用新主题后,请转到 config/theme.dart 。

接下来,在“主题颜色”部分下方添加颜色,如以下示例所示。

// Light Colors
ColorStyles lightColors = LightThemeColors();

// Dark Colors
ColorStyles darkColors = DarkThemeColors();

// My New Bright Colors 
ColorStyles brightColors = BrightThemeColors();
...

接下来,在 ThemeConfig 类中添加新主题,如以下示例所示。

...
// Preset Themes
class ThemeConfig {

  // LIGHT
  static BaseThemeConfig<ColorStyles> light() => BaseThemeConfig<ColorStyles>(
    id: "default_light_theme",
    description: "Light theme",
    theme: lightTheme(lightColors),
    colors: lightColors,
  );

  // My new theme
  static BaseThemeConfig<ColorStyles> bright() => BaseThemeConfig<ColorStyles>(
   id: "default_bright_theme", // id when switching theme in the app
   description: "Bright theme",
   theme: brightTheme(brightColors),
   colors: brightColors,
  );

最后,在 appThemes 配置中添加新主题。下面是一个示例。

final appThemes = [

  ThemeConfig.bright(), // 第一个将设置为默认主题

  ThemeConfig.light(),

  ThemeConfig.dark(),
];

主题颜色

要管理项目中的主题颜色,请查看 lib/resources/themes/styles 目录。此目录包含 light_theme_colors.dart 和 dark_theme_colors.dart 的样式颜色。

在该文件中,应该有类似下面的内容。

// e.g Light Theme colors
class LightThemeColors implements ColorStyles {
  // general
  Color get background => const Color(0xFFFFFFFF);
  Color get primaryContent => const Color(0xFF000000);
  Color get primaryAccent => const Color(0xFF87c694);

  Color get surfaceBackground => Colors.white;
  Color get surfaceContent => Colors.black;

  // app bar
  Color get appBarBackground => Colors.blue;
  Color get appBarPrimaryContent => Colors.white;

  // buttons
  Color get buttonBackground => Colors.blueAccent;
  Color get buttonPrimaryContent => Colors.white;

  // bottom tab bar
  Color get bottomTabBarBackground => Colors.white;

  // bottom tab bar - icons
  Color get bottomTabBarIconSelected => Colors.blue;
  Color get bottomTabBarIconUnselected => Colors.black54;

  // bottom tab bar - label
  Color get bottomTabBarLabelUnselected => Colors.black45;
  Color get bottomTabBarLabelSelected => Colors.black;
}

在组件中使用颜色

import 'package:flutter_app/config/theme.dart';
...

// gets the light/dark background colour depending on the theme
ThemeColor.get(context).background

// e.g. of using the "ThemeColor" class
Text(
  "Hello World",
  style: TextStyle(
      color:  ThemeColor.get(context).primaryContent // Color - primary content
  ),
),

// or 

Text(
  "Hello World",
  style: TextStyle(
      color:  ThemeConfig.light().colors.primaryContent // Light theme colors - primary content
  ),
),

基本样式

基本样式允许您从代码中的一个区域自定义各种小部件颜色。

Nylo 为您的项目提供了预配置的基本样式,位于 lib/resources/themes/styles/color_styles.dart。

这些样式为 light_theme_colors.dart 和 dart_theme_colors.dart 中的主题颜色提供了接口。

lib/resources/themes/styles/color_styles.dart 文件

abstract class ColorStyles {
  // general
  Color get background;
  Color get primaryContent;
  Color get primaryAccent;

  // app bar
  Color get appBarBackground;
  Color get appBarPrimaryContent;

  // buttons
  Color get buttonBackground;
  Color get buttonPrimaryContent;

  // bottom tab bar
  Color get bottomTabBarBackground;

  // bottom tab bar - icons
  Color get bottomTabBarIconSelected;
  Color get bottomTabBarIconUnselected;

  // bottom tab bar - label
  Color get bottomTabBarLabelUnselected;
  Color get bottomTabBarLabelSelected;
}

您可以在此处添加其他样式,然后在主题中实现颜色。

切换主题

Nylo 支持即时切换主题的功能。

例如,如果用户点击按钮激活 "深色主题",则需要切换主题。

您可以通过执行以下操作来支持这一点:

import 'package:nylo_framework/theme/helper/ny_theme.dart';
...

TextButton(onPressed: () {

    // set theme to use the "dark theme" 
    NyTheme.set(context, id: "dark_theme");
    setState(() { });
  
  }, child: Text("Dark Theme")
),

// or

TextButton(onPressed: () {

    // set theme to use the "light theme" 
    NyTheme.set(context, id: "light_theme");
    setState(() { });
  
  }, child: Text("Light Theme")
``

定义主题

主题在 config/app_theme.dart 文件中定义。

// App Themes
final appThemes = [

  ThemeConfig.light(),

  ThemeConfig.dark(),
];

字体

在 Nylo 中更新整个应用程序的主要字体非常简单。打开 lib/config/font.dart 文件并更新以下内容。

final TextStyle appThemeFont = GoogleFonts.lato();

我们在版本库中包含了 GoogleFonts 库,因此你只需花很少的精力就能开始使用所有字体。要将字体更新为其他字体,可以执行以下操作:

// OLD
// final TextStyle appThemeFont = GoogleFonts.lato();

// NEW
final TextStyle appThemeFont = GoogleFonts.montserrat();

需要使用自定义字体?查看本指南 - flutter.dev/docs/cookbo…

添加字体后,更改变量,如以下示例所示。

final TextStyle appThemeFont = TextStyle(fontFamily: "ZenTokyoZoo");

设计

config/design.dart 文件用于管理应用的设计元素。

logo 变量用于显示应用的logo。

loader 变量用于显示加载器。Nylo 会在某些辅助方法中使用该变量作为默认加载器部件。

您可以修改 resources/widgets/logo_widget.dart,自定义显示徽标的方式。

文本样式

以下是您可以在 Nylo 中使用的可用文本样式。

规则名称用法说明
Display LargeText("Hello World").displayLarge(context)大字体
Display MediumText("Hello World").displayMedium(context)中等字体
isplay SmallText("Hello World").displaySmall(context)小字体
Heading LargeText("Hello World").headingLarge(context)
Heading MediumText("Hello World").headingMedium(context)
Heading SmallText("Hello World").headingSmall(context)
Title LargeText("Hello World").titleLarge(context)
Title MediumText("Hello World").titleMedium(context)
Title SmallText("Hello World").titleSmall(context)
Body LargeText("Hello World").bodyLarge(context)
Body MediumText("Hello World").bodyMedium(context)
Body Small 机身小巧Text("Hello World").bodySmall(context)
Font Weight BoldText("Hello World").fontWeightBold()将字体粗细应用于组件文本
Font Weight LightText("Hello World").fontWeightLight()将字体粗细应用于组件文本
Set ColorText("Hello World").setColor(context, (color) => colors.primaryAccent)设置字体颜色
Align LeftText("Hello World").alignLeft()将字体左对齐
Align RightText("Hello World").alignRight()将字体右对齐
Align CenterText("Hello World").alignCenter()将字体居中对齐
Set Max LinesText("Hello World").setMaxLines(5)设置文本的最大行数