16 | 从夜间模式说起,如何定制不同风格的App主题?
该思维导图由 AI 生成,仅供参考
- 深入了解
- 翻译
- 解释
- 总结
Flutter主题定制是App开发中的重要特性,本文介绍了如何在Flutter中定制不同风格的App主题,从夜间模式说起。作者首先介绍了主题定制的概念,将主题视为视觉效果在不同场景下的可视资源和相应的配置集合。在iOS、Android和前端中,主题的配置信息通常预先写入文件或属性值中,通过单例或特定方法进行切换。而在Flutter中,可以使用ThemeData来统一管理主题的配置信息。通过ThemeData,可以实现全局范围和局部范围的样式切换。全局统一的视觉风格定制可以通过MaterialApp的初始化方法来设置主题,而局部独立的视觉风格定制可以使用Theme来对App的主题进行局部覆盖。此外,主题的另一个重要用途是样式复用,可以通过Theme.of(context)方法取出对应的属性,应用到子Widget的样式中。文章通过示例代码演示了如何在Flutter中实现主题的定制和切换,帮助读者快速了解了主题定制的基本概念和实现方法。除了主题之外,读者还可以利用defaultTargetPlatform变量实现一些其他需要判断平台的逻辑,比如在界面上使用更符合Android或iOS设计风格的组件。文章最后给出了思考题,鼓励读者在评论区分享观点,为读者提供了进一步学习的机会。
《Flutter 核心技术与实战》,新⼈⾸单¥59
全部留言(15)
- 最新
- 精选
- daoimport 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; void main() => runApp(MyThemePage()); class MyThemePage extends StatelessWidget { // iOS 浅色主题 final ThemeData kIOSTheme = ThemeData( brightness: Brightness.light, accentColor: Colors.white, primaryColor: Colors.blue, iconTheme: IconThemeData(color: Colors.grey), textTheme: TextTheme(body1: TextStyle(color: Colors.black))); // Android 深色主题 final ThemeData kAndroidTheme = ThemeData( brightness: Brightness.dark, // 深色主题 accentColor: Colors.black, //(按钮)Widget 前景色为黑色 primaryColor: Colors.cyan, // 主题色为青色 iconTheme: IconThemeData(color: Colors.blue), //icon 主题色为蓝色 textTheme: TextTheme(body1: TextStyle(color: Colors.red)) // 文本主题色为红色 ); Widget build(BuildContext context) { var theme = MyTheme( title: 'Flutter Demo Home Page', themes: [kIOSTheme, kAndroidTheme], ); return MaterialApp( title: 'My Theme', theme: kAndroidTheme, home: theme, ); } } class MyTheme extends StatefulWidget { MyTheme({Key key, this.title, this.themes}) : super(key: key); final String title; final List<ThemeData> themes; _MyThemeState createState() => _MyThemeState(); } class _MyThemeState extends State<MyTheme> { bool isLight; @override void initState() { isLight = true; super.initState(); } @override Widget build(BuildContext context) { return Theme( child: Scaffold( appBar: AppBar( title: Text('Theme switch'), ), floatingActionButton: FloatingActionButton( child: Text(isLight ? 'Night' : 'Light'), onPressed: () { setState(() { isLight = !isLight; }); }, ), ), data: isLight ? widget.themes[0] : widget.themes[1]); } }
作者回复: 赞
2019-08-10212 - 灰灰class _HomeState extends State<Home> with SingleTickerProviderStateMixin { TabController _controller; bool isNight = false; @override void initState() { super.initState(); _controller = TabController(length: 2, vsync: this); } @override Widget build(BuildContext context) { return Theme( data: ThemeData( brightness: isNight ? Brightness.dark : Brightness.light, ), child: Stack( children: <Widget>[ Scaffold( ... ), Positioned( bottom: 20, right: 20, child: FloatingActionButton( onPressed: () {setState(() { isNight = !isNight; });}, child: Text(isNight ? '日间' : '夜间'), ), ) ], ), ); } @override void dispose() { _controller.dispose(); super.dispose(); } }
作者回复: 赞
2019-08-0625 - ΩdefaultTargetPlatform这个变量哪里来的,文章中没有说明清楚
作者回复: import 'package:flutter/foundation.dart';
2019-08-052 - 小米思考题: 1、增加一个布尔变量 bool _isLight = false 2、在ThemeData中,根据_isLight来显示是否为高亮或者暗色。 brightness: _isLight ? Brightness.light : Brightness.dark 3、增加一个切换按钮,点击改变_isLight值。 FlatButton(onPressed: (){setState(() { _isLight = !_isLight; });},child: Text(_isLight?"白天":"夜间"))
作者回复: 赞
2019-08-052 - 文心雕龙第三方插件 https://pub.dev/packages/dynamic_theme#-readme-tab-
作者回复: 赞
2019-08-061 - 菜头Theme.of(context) 方法将向上查找 Widget 树,并返回 Widget 树中最近的主题 Theme。如果 Widget 的父 Widget 们有一个单独的主题定义,则使用该 Theme 如果不是,就使用 App 全局 Theme。 这个表示没太懂。 最近?是表示其第一个 superWidget 吗? 父 Widget 们?一个 widget 有多个父 widget?
作者回复: 父Widget们=祖先
2019-11-15 - zzz请问下,目前主流的App内UI的样式应该不会局限于ThemeData中的定义的情况。比如有一个自定义的Button,是在代码中设置的特殊Color,不是Themedata里的,这种情况下的button(或类似实现的全部widget),对于日夜间切换这种动态处理的时候,有统一的换颜色的方法么?还是需要在每个widget中都要实现对应的颜色处理?同样的对于TextTheme,ThemeData只提供了textTheme,primaryTextTheme,accentTextTheme三种,如果App内有更多的通用TextTheme,如何动态的统一切换呢?
作者回复: 你可以自己抽象出一套属性配置,控制的粒度更细一些,通过开关统一切换,本质上和系统主题类似
2019-10-23 - 🌝如果全局更改主题的话,那岂不是要把MaterialApp这个Widget设置成有状态的widget?这样子是不是更耗性能
作者回复: 是啊,换主题本身就相当于重建整个App的UI了,自然需要重走一遍根视图的生命周期
2019-09-20 - 和小胖老师,这个全局主题的设置只是针对于布局中的对应 widget 没有设置样式才会生效吧?例如我在 ThemeData 里面设置了文字颜色为黑色?但是我在子 widget 里面设置了一个文字会红色,那么此时黑色是不生效的吧?
作者回复: 对,会覆盖
2019-09-04 - 宋世通老师,在flutter1.8.2,1.8.3版本中增加了ThemeMode,是不是用这个来控制主题明暗会更好一点?
作者回复: 可以的。ThemeMode是在主题之上,是用来设置是否跟随系统设置的属性,你可以通过它来强制设置App主题为明或暗,也可以跟随系统,这样就需要把两套主题都实现了
2019-08-062