[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仓库

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客:https://www.jianshu.com/u/81e1a1228180复制
如有侵权,请联系 yunjia_community@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • Flutter主题切换 flutter redux

    创建一个State对象AppState,用于储存需要共享的主题数据,并且完成AppState初始化工作,如下面代码所示

    易寒
  • Flutter UI如何使用Provide实现主题切换详解

    provide是谷歌官方出品的一个状态管理框架flutter-provide,它允许在小部件树中传递数据,它被设计为ScopedModel的替代品,允许我们更加...

    砸漏
  • Flutter 中使用Chip 小部件【Flutter专题30】

    本文是关于 Flutter 中的 Chip 小部件。我们将大致了解小部件的基本原理,然后通过代码来实现它。事不宜迟,让我们开始吧。

    nuts
  • 在 Flutter 中使用 NavigationRail 和 BottomNavigationBar【Flutter专题33】

    本文将向您展示如何使用NavigationRail和BottomNavigationBar在 Flutter 中创建自适应布局。我们将浏览一下这个概念,然后通过...

    nuts
  • ubuntu使用MAC主题

    ubuntu使用MAC主题,步骤如下: 1. 下载mac壁纸(Download MacBuntu OS Wallpapers and extract to p...

    若与
  • Flutter 主题设置及夜间模式

    Theme 组件可以为 Material APP 定义主题数据(ThemeData)。Material 组件库里很多组件都使用了主题数据,如导航栏颜色、标题字体...

    子晋
  • flutter常见问题【3】:Flutter 使用Android studio 打包生成apk

    如果左下侧没有 terminal 命令行窗口,可以在项目根目录上右击=》Open in Terminal

    sinnoo
  • Flutter 中使用十六进制颜色代码【Flutter专题21】

    在 Flutter 中, Color 类只接受整数作为参数, 否则我们需要使用名称构造函数 fromARGB/fromRGBO 如果我们有 Hexa 颜色代码,...

    nuts
  • hexo主题使用与修改

    如果在markdown文件中不添加updated这个值,那么hexo会获取文件的修改日期,并渲染出来。

    AnRFDev
  • Flutter Image 使用

    Simulator Screen Shot - iPhone Xʀ - 2019-09-05 at 16.18.21.png

    赵哥窟
  • Flutter GridView 使用

    今天学习一下在Flutter中怎么使用GridView,效果如上图。 头部是一个Banner,使用的是第三方的

    赵哥窟
  • Flutter 2022 战略和路线解读与想法

    最近 Flutter 发布了官方关于 2022 的 战略 和 路线图 ,本篇主要针对内容做一些总结和解读,给正在使用 Flutter 或者正打算使用 Flute...

    GSYTech
  • Flutter完整开发实战详解(五、 深入探索)

    作为系列文章的第五篇,本篇主要探索下 Flutter 中的一些有趣原理,帮助我们更好的去理解和开发。

    GSYTech
  • [flutter专题]6详解AppBar小部件

    应用栏是各种应用程序中最常用的组件之一。它可用于容纳搜索字段、以及在页面之间导航的按钮,或者只是页面标题。由于它是一个如此常用的组件,因此 Flutter 为该...

    nuts
  • Android原生项目集成Flutter Module

    成功执行后,会在.android/Flutter/build/outputs/aar/目录下,创建一个flutter-debug.aar的包文件

    DSoon
  • Flutter 1.12 最新 hotfix 与 2020 路线计划

    大年初三的时候 v1.12.13+hotfix.7 终于发布了,该版本发布后总算把 1.12.13 版本上的几个大坑填完,算是达到“能用”的稳定版本;同时 1 ...

    GSYTech
  • 2022年Flutter真的会一统大前端吗?

    在创建 iOS 和 Android 应用程序时,通常推荐使用 Flutter,因为使用它更加简单高效。正是由于 Flutter 的诸多优势,它在许多情况下都是移...

    nuts

扫码关注云+社区

领取腾讯云代金券