美文网首页
Flutter ThemeData尝试 2022-11-28 周

Flutter ThemeData尝试 2022-11-28 周

作者: 松哥888 | 来源:发表于2022-11-29 18:03 被阅读0次

简介

自定义的颜色系统存在更新的问题,暂时还没有很好的接近方案。
那么,相对应的,使用系统提供的ThemeData也是一种方案。

自定义颜色

ThemeExtensions 是在Flutter 3.0 中ThemeData类中新增的对象,通过它可以扩展自己想自定义的属性字段。

  • 定义一些字符串,作为map的key
class ColorSring {
  static String colffffff = "ffffff";
  static String col000000 = "000000";
  static String colefedf3 = "efedf3";
  static String col333333 = "333333";
}
  • 自定义一个类,分为浅色和深色两套,统一通过字符串的key取颜色
/// 自定义的颜色
class CustomColor extends ThemeExtension<CustomColor> {
  final bool isDarkMode;

  CustomColor(this.isDarkMode);

  /// 这两个方法都不实现,简单返回自身
  @override
  ThemeExtension<CustomColor> copyWith() {
    return this;
  }

  @override
  ThemeExtension<CustomColor> lerp(
      ThemeExtension<CustomColor>? other, double t) {
    return this;
  }

  /// 自定义的颜色
  Map<String, Color> lightInfo = {
    ColorSring.colffffff: const Color(0xffffffff),
    ColorSring.col000000: const Color(0xff000000),
    ColorSring.colefedf3: const Color(0xffefedf3),
    ColorSring.col333333: const Color(0xff333333),
  };
  Map<String, Color> darkInfo = {
    ColorSring.colffffff: const Color(0xff000000),
    ColorSring.col000000: const Color(0xffffffff),
    ColorSring.colefedf3: const Color(0xff151515),
    ColorSring.col333333: const Color(0xffD8D8D8),
  };

  /// 根据key,得到响应的颜色;key不存在,默认给黑色
  Color confgColor(String colkey) {
    Map colorinfo = isDarkMode ? darkInfo : lightInfo;
    return colorinfo[colkey] ?? Colors.black;
  }
}

之所以这样设计的原因,就是为了统一名字,在用的时候,只要关注浅色模式一种就可以了。比如ColorSring.colefedf3就对应UI设计图上的#efedf3;切换为深色模式的时候,自动改为对应的颜色#151515(浅色模式对应的深色模式颜色值可以让UI给出)

  • 创建两个ThemeData分别代表浅色和深色模式,把自定义的颜色类CustomColor放入对应的ThemeExtensions字段就可以了。
/// 白天模式
ThemeData lightTheme = ThemeData.light().copyWith(
  extensions: <ThemeExtension<dynamic>>[
    CustomColor(false),
  ],
);

/// 夜间模式
ThemeData darkTheme = ThemeData.dark().copyWith(
  extensions: <ThemeExtension<dynamic>>[
    CustomColor(true),
  ],
);
  • 使用的时候,直接使用Theme.of就可以了
CustomColor customColor =
          Theme.of(Get.context!).extension<CustomColor>()!;

customColor.confgColor(PandaColorSring. colffffff),
customColor.confgColor(PandaColorSring. col000000),
customColor.confgColor(PandaColorSring. colefedf3),
customColor.confgColor(PandaColorSring. col333333),
  • 如果想再包一层,要注意用普通的对象,不能用静态属性,也不能用单例。
class ColorConfig {
  /// 取当前的主题色
  CustomColor customColor = Theme.of(Get.context!).extension<CustomColor>()!;
  Color get colffffff => customColor.confgColor(PandaColorSring.colffffff);
  Color get col000000 => customColor.confgColor(PandaColorSring.col000000);
  Color get colefedf3 => customColor.confgColor(PandaColorSring.colefedf3);
  Color get col333333 => customColor.confgColor(PandaColorSring.col333333);


/// 使用的地方
ColorConfig().confgColor(PandaColorSring. colffffff),
ColorConfig().confgColor(PandaColorSring. col000000),
ColorConfig().confgColor(PandaColorSring. colefedf3),
ColorConfig().confgColor(PandaColorSring. col333333),
}

如果封装为静态属性,或者单例,会导致theme切换的时候无法更新,千万注意

参考文章

Flutter ~ ThemeData通过ThemeExtension扩展自定义属性

另外一种思路

通过字典存储,通过定义key来获取是一种方案。
另外,通过三目运算符,利用get属性(其实就是函数),也是一种方案。

/// 自定义颜色
class CustomColor extends ThemeExtension<CustomColor> {
  final bool isDarkMode;
  CustomColor(this.isDarkMode);

  /// 这两个方法都不实现,简单返回自身
  @override
  ThemeExtension<CustomColor> copyWith() {
    return this;
  }

  @override
  ThemeExtension<CustomColor> lerp(
      ThemeExtension<CustomColor>? other, double t) {
    return this;
  }

  /// 颜色定义,分为深色,浅色两套
  Color get backgrouderDefault => isDarkMode
      ? ColorUtil.hexStringColor('#000000')
      : ColorUtil.hexStringColor('#FFFFFF');
  Color get backgrouderCard => isDarkMode
      ? ColorUtil.hexStringColor('#1C1C1E')
      : ColorUtil.hexStringColor('#FFFFFF');
  Color get backgrouderNavigationBar => isDarkMode
      ? ColorUtil.hexStringColor('#262728')
      : ColorUtil.hexStringColor('#FFFFFF');
  Color get backgrouderBottomSheet => isDarkMode
      ? ColorUtil.hexStringColor('#2C2C2E')
      : ColorUtil.hexStringColor('#FFFFFF');
  Color get backgrouder5 => isDarkMode
      ? ColorUtil.hexStringColor('#3A3A3C')
      : ColorUtil.hexStringColor('#FFFFFF');
}

相关文章

  • Flutter ThemeData尝试 2022-11-28 周

    简介 自定义的颜色系统存在更新的问题,暂时还没有很好的接近方案。那么,相对应的,使用系统提供的ThemeData也...

  • Flutter入门 -- ThemeData

    用于自定义应用程序的主题颜色和排版等。 在Flutter中有两种方法来使用主题,一种是全局范围的主题 一种是使用 ...

  • Flutter自定义主题并切换保存

    现在越来越多的应用程序支持黑/白主题切换了,在Flutter中更是简单,Flutter库中提供了ThemeData...

  • Flutter 中ThemeData 介绍

    ThemeData的定义 属性介绍 applyElevationOverlayColor默认值是false 在b...

  • Flutter:Theme

    在Flutter中使用ThemeData来在应用中共享颜色和字体样式,Theme有两种:全局Theme和局部The...

  • ThemeData 属性含义

    在Flutter中使用ThemeData来在应用中共享颜色和字体样式,Theme有两种:全局Theme和局部The...

  • Flutter(三十二)ThemeData主题

    说明 Flutter 预先定义了一系列的主题,各个widget都全部或局部使用了这些主题,因此当更改了预定义主题后...

  • ThemeData使用

    ThemeData使用 ThemeData 属性 Brightness brightness 深色或者浅色主题。d...

  • 3、Flutter中ThemeData与AppBar

    本次主要是记录Fultter Theme主题的设备与AppBar中的一些属性的使用及说明。目前项目开发有了四个界面...

  • Flutter 学习 之 主题设置 ThemeData

    基于ThemeData 实现主题切换 1. 实现可以亮暗主题切换2. 实现可以颜色主题的切换3.当主题为白色的时候...

网友评论

      本文标题:Flutter ThemeData尝试 2022-11-28 周

      本文链接:https://www.haomeiwen.com/subject/dsnhfdtx.html