Flutter学习之实现自定义themes详解

作者:程序那些事 时间:2022-04-17 17:20:49 

简介

一般情况下我们在flutter中搭建的app基本上都是用的是MaterialApp这种设计模式,MaterialApp中为我们接下来使用的按钮,菜单等提供了统一的样式,那么这种样式能不能进行修改或者自定义呢?

答案是肯定的,一起来看看吧。

MaterialApp中的themes

MaterialApp也是一种StatefulWidget,在MaterialApp中跟theme相关的属性有这样几个:

final ThemeData? theme;
 final ThemeData? darkTheme;
 final ThemeData? highContrastTheme;
 final ThemeData? highContrastDarkTheme;
 final ThemeMode? themeMode;

先来看下ThemeMode的定义:

enum ThemeMode {
 system,
 light,
 dark,
}

ThemeMode是一个枚举类,里面有三个枚举值,分别是system,light和dark。

我们都知道现在手机有一个暗黑模式,ThemeMode的这三种模式就是为了适应暗黑模式而生的。

system表示是系统默认的模式,light是明亮模式,dark是暗黑模式。

而ThemeData则定义了主题中各种组件或者行动的配色。

那么如果我们想要实现自定义themes的功能,就可以利用这个ThemeData类来重写其中要重写的颜色。

ThemeData中还有专门为color变化定义的ColorScheme,还有为Text变化设置的TextTheme,这两个theme实际上是一系列的color集合。

除了ThemeData,flutter中还有一个类叫做Theme。

Theme是一个StatelessWidget,这个widget中包含了ThemeData,它提供了一个Theme.of方法来让子widget获得最近的ThemeData数据。

这就意味着,在flutter中,子widget可以使用和父widget不同的主题,非常的棒。

自定义themes的使用

那么如何使用自定义themes呢?有两种方式。

第一种就是在使用MaterialApp的时候传入自定义的themes,如下所示:

Widget build(BuildContext context) {
   return MaterialApp(
     title: 'Flutter Demo',
     theme: ThemeData(
       primarySwatch: Colors.blue,
     ),
     home: const MyHomePage(title: 'Flutter Demo Home Page'),
   );
 }
}

但是这种操作实际是传入了一个全新的ThemeData,假如我们只想修改部分ThemeData中的数据应该如何处理呢?

我们可以使用Theme.of方法从当前的Theme中拷贝一份,然后再调用copyWith方法,传入要修改的自定义属性即可。

如下所示:

Widget build(BuildContext context) {
   return MaterialApp(
     title: 'Flutter Demo',
     theme: Theme.of(context).copyWith(useMaterial3: true),
     home: const MyHomePage(title: 'Flutter Demo Home Page'),
   );
 }
}

前面我们提到了Theme这个widget,我们还可以将要自定义Theme的widget用Theme包裹起来,理论上我们可以将任何widget都用Theme来进行包装。

比如之前的floatingActionButton的实现是直接返回一个FloatingActionButton:

floatingActionButton: FloatingActionButton(
         onPressed: _incrementCounter,
         tooltip: 'Increment',
         child: const Icon(Icons.add),
       )

然后我们可以把FloatingActionButton用Theme包装起来,如下所示:

floatingActionButton: Theme(
       data: Theme.of(context).copyWith(focusColor: Colors.yellow),
       child: FloatingActionButton(
         onPressed: _incrementCounter,
         tooltip: 'Increment',
         child: const Icon(Icons.add),
       ),
     )

这样不同的组件就拥有了不同的theme。

来源:https://juejin.cn/post/7207242529095598139

标签:Flutter,自定义,themes
0
投稿

猜你喜欢

  • Java注解@Transactional事务类内调用不生效问题及解决办法

    2022-04-03 18:42:06
  • Android实现调用摄像头拍照并存储照片

    2023-05-02 10:48:20
  • C#实现一阶卡尔曼滤波算法的示例代码

    2022-12-23 05:28:45
  • C语言文件操作函数大全(超详细)

    2023-07-15 06:20:42
  • 如何使用Jenkins编译并打包SpringCloud微服务目录

    2021-09-25 07:07:01
  • mybatis查询语句揭秘之参数解析

    2021-07-10 01:17:18
  • Java设计模式之工厂模式分析【简单工厂、工厂方法、抽象工厂】

    2021-07-07 21:11:57
  • springboot中的springSession的存储和获取实现

    2023-11-04 10:23:14
  • C#使用Process类调用外部程序分解

    2022-01-07 16:34:11
  • Apache Commons fileUpload实现文件上传之一

    2022-12-06 12:36:48
  • Spring Cloud Gateway 服务网关快速实现解析

    2023-12-19 04:28:33
  • Android开发笔记之:一分钟学会使用Logcat调试程序的详解

    2022-07-19 05:17:22
  • Spring Security中使用authorizeRequests遇到的问题小结

    2023-10-07 04:23:45
  • Java 多线程Synchronized和Lock的区别

    2023-08-14 11:39:09
  • C#+无unsafe的非托管大数组示例详解(large unmanaged array in c# without ‘unsafe’ keyword)

    2021-06-07 13:33:55
  • C#实现文字转语音功能

    2022-06-18 13:07:59
  • Java下利用Jackson进行JSON解析和序列化示例

    2023-09-27 14:37:38
  • java后台接受到图片后保存方法

    2023-06-03 09:23:04
  • Android中volley封装实践记录(二)

    2023-05-17 02:37:13
  • Java Springboot的目的你知道吗

    2022-12-20 14:16:24
  • asp之家 软件编程 m.aspxhome.com