[Flutter]使用主题

使用主题可以在App里面共享颜色和字体样式。在Flutter里面有两种方式来使用主题,一种是全局范围的、一种是使用Theme Widget, Theme Widget可以在App的某个部分使用主题。全局的主题其实也就是MaterialAppTheme 做为根widget了。

主题定义好后,就可以在Widgets里面使用了。

创建一个全局主题

MaterialApp 接收一个theme的参数,类型为ThemeData,为App提供统一的颜色和字体。支持的参数可以在这里查看

new MaterialApp(
    title: title,
    theme: new ThemeData(
        brightness: Brightness.dark,
        primaryColor: Colors.lightBlue[800],
    ),
);

创建一个局部主题

如果想为某个页面使用不同于App的风格,可以使用Theme来覆盖App的主题.

new Theme(
    data: new ThemeData(
        accentColor: Colors.yellow,
    ),
    child: new Text('Hello World'),
);

扩展App的主题

如果你不想覆盖所有的样式,可以继承App的主题,只覆盖部分样式,使用copyWith方法。

new Theme(
    data: Theme.of(context).copyWith(accentColor: Colors.yellow),
    child: new Text('use copyWith method'),
);

使用主题

创建好主题后,要如何使用呢,在Widget的构造方法里面通过Theme.of(context)方法来调用。

Theme.of(context) 会查找Widget 树,并返回最近的一个Theme对象。如果父层级上有Theme对象,则返回这个Theme,如果没有,就返回App的Theme

new Container(
    color: Theme.of(context).accentColor,
    chile: new Text(
        'Text with a background color',
        style: Theme.of(context).textTheme.title,
    ),
);

完整例子代码

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(new MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final appName = 'Custom Themes';

    return new MaterialApp(
      title: appName,
      theme: new ThemeData(
        brightness: Brightness.dark,
        primaryColor: Colors.lightBlue[800],
        accentColor: Colors.cyan[600],
      ),
      home: new MyHomePage(
        title: appName,
      ),
    );
  }
}

class MyHomePage extends StatelessWidget {
  final String title;

  MyHomePage({Key key, @required this.title}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text(title),
      ),
      body: new Center(
        child: new Container(
          color: Theme.of(context).accentColor,
          child: new Text(
            'Text with a background color',
            style: Theme.of(context).textTheme.title,
          ),
        ),
      ),
      floatingActionButton: new Theme(
        data: Theme.of(context).copyWith(accentColor: Colors.yellow),
        child: new FloatingActionButton(
          onPressed: null,
          child: new Icon(Icons.add),
        ),
      ),
    );
  }
}

关于学习

flutter的学习文章都整理在这个github仓库

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [Flutter]使用顶部切换导航TabBar

    目前移动开发tab切换是一个很通用的功能,Flutter 通过Material 库提供了很方便的API来使用tab切换。

    吴老师
  • [Flutter]使用SnackBar

    SnackBar是用户操作后,显示提示信息的一个控件,类似Toast,会自动隐藏。它还可以添加操作按钮,等等。SnackBar是通过Scaffold的showS...

    吴老师
  • Flutter TextStyle参数解析关于学习

    吴老师
  • 以太坊区块链 Asp.Net Core的安全API设计 (上)

    去中心化应用程序(DApp)的常见设计不仅依赖于以太坊区块链,还依赖于API层。在这种情况下,DApp通过用户的以太坊帐户与智能合约进行交互,并通过交换用户凭据...

    笔阁
  • 【Netty之初体验】

    什么是Netty? Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。 Netty ...

    用户5640963
  • eosjs转账代码

    本文介绍使用V20版本的eosjs实现代币转账的思路,并给出eosjs转账的实现代码。

    用户1408045
  • Android架构分析【三】mvp-cleanClean Architecture代码分析总结

    乍一看这张图,就像洋葱,一层包一层,其核心理念就是向内依赖。也就是说:外层依赖内层,内层不能依赖外层,层层向内依赖。越往内,越稳定。在这个核心理念下,定义...

    用户2930595
  • spring通过@Profile解决环境变量的问题

    在profile推出之前,通过不同系统的环境变量切换,通过一些手动或者写死的方法进行切换非常费时费力,而且有些系统来回几套系统在切换的时候经常性出现各种问题.....

    逍遥壮士
  • Python 技巧篇-如何避免python报错导致强制关闭窗口

    运行窗口是我们获取信息的重要途径,但是运行的过程中,窗口自己就关了,我么甚至不能知道程序是运行完了还是报错了。比如:有时也就眼前一闪,大概好像看到有一点报错信息...

    小蓝枣
  • 同事牛逼啊,写了个隐藏 bug,我排查了 3 天才解决问题!

    最近线上监控 SFTP 连接频繁爆表,通过重启某个系统,连接数迅速下降,系统就能恢复正常,初步判断是应用程序连接未关闭的问题导致的。

    Java技术栈

扫码关注云+社区

领取腾讯云代金券