Flutter Web网站之最简方式实现暗黑主题无缝切换

news/2024/5/20 20:39:44/文章来源:https://blog.csdn.net/m0_46622598/article/details/106075118

往期

  • Flutter Web网站搭建教程
  • Flutter Web 网站之主页框架搭建
  • Flutter Web网站之Jetpack成型
  • Flutter Web网站之ScrollView+GridView优化

上期回顾

上期我们做了优化,主要针对ScrollView+GridView的使用场景,用了更加合适的组件,这期想做一个主题变更,为什么呢?

  • 第一 暗黑主题越来越刚需化,现在哪个主流App没有暗黑都不好意思上架,而ios阵营更加强硬的要求平台实现,否则下架,库克牛逼,我们惹不起。
  • 第二 项目还处于初期,这个时候重构改动成本较低
  • 第三 主题的变更网上有很多框架可以快速实现,但我想寻求的是最简单的实现,不想引入别人的框架,一来自己了如指掌,二来不用依赖别人的升级来满足未来奇葩的需求。
    这期实现其实很简单,来往下看。

实现效果

大屏浅色
大屏暗黑
小屏浅色
小屏暗黑

代码实现

定义主题类AppTheme,用来配置不同的ThemeData

class AppTheme {ThemeData themeData;AppTheme(this.themeData);// ignore: non_constant_identifier_namesstatic final AppTheme DARK_THEME = AppTheme(ThemeData.dark());// ignore: non_constant_identifier_namesstatic final AppTheme LIGHT_THEME = AppTheme(ThemeData(brightness: Brightness.light, primaryColor: Colors.grey[50]));
}

DARK_THEME暗黑主题
LIGHT_THEME浅色主题、浅色标题栏默认蓝色,这里我改成浅灰色

定义StreamController,用来动态变更数据

class ThemeBloc {// ignore: close_sinksfinal _themeStreamController = StreamController<AppTheme>();/// 变更主题调用方法get changeTheTheme => _themeStreamController.sink.add;/// 主题数据get themeData => _themeStreamController.stream;
}final bloc = ThemeBloc();

给原来的MaterialApp包一层StreamBuilder

 StreamBuilder<AppTheme>(initialData: AppTheme.LIGHT_THEME,stream: bloc.themeData,builder: (context, AsyncSnapshot<AppTheme> snapshot) {return MaterialApp(title: 'Jetpack',theme: snapshot.data.themeData,home: PageHome(),routes: <String, WidgetBuilder>{"/qq": (context) => PageQQLink(),"/pageChatGroup": (context) => PageChatGroup(),},);})

initialData 默认数据
stream 将bloc.themeData赋值给它,用来监听数据变化
snapshot 数据变化的快照,最终交给MaterialApp的theme,从而实现动态变更。如何触发变更数据呢?

如图设置页面添加了开关,代码如下

SwitchListTile(secondary: Icon(_isEnabled ? Icons.brightness_4 : Icons.brightness_5),title: Text("暗黑主题"),subtitle: Text("将主题调成暗黑色"),value: _isEnabled,onChanged: (value) {setState(() {_isEnabled = value;});if (value) {bloc.changeTheTheme(AppTheme.DARK_THEME);} else {bloc.changeTheTheme(AppTheme.LIGHT_THEME);}},)

这里调用bloc.changeTheTheme来变更主题。
对变更主题就是这么简单,你是不是有疑问,我如何修改其他主题呢(如:文本,按钮,对话框等)

ThemeData

再看下我得实现

  static final AppTheme LIGHT_THEME = AppTheme(ThemeData(brightness: Brightness.light, primaryColor: Colors.grey[50]));

我这里修改了brightness、primaryColor,其实它还有很多,请看

 ThemeData({Brightness brightness,VisualDensity visualDensity,MaterialColor primarySwatch,Color primaryColor,Brightness primaryColorBrightness,Color primaryColorLight,Color primaryColorDark,Color accentColor,Brightness accentColorBrightness,Color canvasColor,Color scaffoldBackgroundColor,Color bottomAppBarColor,Color cardColor,Color dividerColor,Color focusColor,Color hoverColor,Color highlightColor,Color splashColor,InteractiveInkFeatureFactory splashFactory,Color selectedRowColor,Color unselectedWidgetColor,Color disabledColor,Color buttonColor,ButtonThemeData buttonTheme,ToggleButtonsThemeData toggleButtonsTheme,Color secondaryHeaderColor,Color textSelectionColor,Color cursorColor,Color textSelectionHandleColor,Color backgroundColor,Color dialogBackgroundColor,Color indicatorColor,Color hintColor,Color errorColor,Color toggleableActiveColor,String fontFamily,TextTheme textTheme,TextTheme primaryTextTheme,TextTheme accentTextTheme,InputDecorationTheme inputDecorationTheme,IconThemeData iconTheme,IconThemeData primaryIconTheme,IconThemeData accentIconTheme,SliderThemeData sliderTheme,TabBarTheme tabBarTheme,TooltipThemeData tooltipTheme,CardTheme cardTheme,ChipThemeData chipTheme,TargetPlatform platform,MaterialTapTargetSize materialTapTargetSize,bool applyElevationOverlayColor,PageTransitionsTheme pageTransitionsTheme,AppBarTheme appBarTheme,BottomAppBarTheme bottomAppBarTheme,ColorScheme colorScheme,DialogTheme dialogTheme,FloatingActionButtonThemeData floatingActionButtonTheme,NavigationRailThemeData navigationRailTheme,Typography typography,CupertinoThemeData cupertinoOverrideTheme,SnackBarThemeData snackBarTheme,BottomSheetThemeData bottomSheetTheme,PopupMenuThemeData popupMenuTheme,MaterialBannerThemeData bannerTheme,DividerThemeData dividerTheme,ButtonBarThemeData buttonBarTheme,}

这里面得主题你都可以修改,你是不是看到了 AppBarTheme、DialogTheme、TextTheme、BottomSheetThemeData等等,不用我解释了吧,你应该知道是谁得样式了吧。

总结

20几行新增得代码就搞定了,为什么还要用别人得框架呢?是吧。

啰嗦一句

计划真的是赶不上变化,不急,慢慢完善哈。

源码

请转github代码查看完整实现

ToDo

该部分内容后期慢慢给大家更新,请客观不要着急,当然你可以参与进来,私聊我就行哦。

  • 示例部准备下期实现,跳转至详情页面,并展示用例。源码已经完成点击即可跳转至github。
  • Tags 部分下期实现,这部分也需要新的UI展现,标签的功能类似与搜索,提供更快捷的方式查找想要的功能。
  • 留言功能设计,在你们使用过程中肯定会有不同的建议,有了这个功能就能知道你们的心声,所以这也是我们需要的实现的一个功能。
  • 优秀的项目推荐,有很多优秀的项目等待着我们去发现,我一个人的能力有限,如果有更多的人来推荐,会不断丰富我们的Jetpack内容。
  • 博客,这里考虑到有很多优秀的大佬,写过相关技术博客,帮你寻找最优秀的资源。功能设计如下图新增按钮。

结束

网站jetpack.net.cn,欢迎常来,也希望能在你学习Flutter的道路上提供一丢丢的帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_893817.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flutter Web网站之Markdown展示与博客列表

往期 Flutter Web网站搭建教程Flutter Web网站之主页框架搭建Flutter Web网站之Jetpack成型Flutter Web网站之ScrollViewGridView优化Flutter Web网站之最简方式实现暗黑主题无缝切换 上期回顾 上期主要实现了主题切换&#xff0c;通过StreamBuilder来动态的切换ThemeData&…

关于云服务器中IE浏览器无法下载和登录网站的问题解决方案

关于云服务器IE浏览器无法下载和登录网站的问题解决方案 原因解决方案 原因 IE浏览器增强安全配置已启用&#xff0c;导致网站的访问权限降低 解决方案 1.进入服务器管理器 2.如图所示&#xff0c;本地服务器-IE增强的安全配置 3.设置为关闭 即可

asp.net802-个人博客网站空间管理系统#毕业设计

项目编号:asp.net802-个人博客网站空间管理系统 运行环境&#xff1a;VSSQL 开发工具:VS2010及以上版本 数据库:SQL2008及以上版本 使用技术&#xff1a;HTMLJSHTML 开发语言&#xff1a;C#&#xff0c;框架&#xff1a;asp.net 互联网彻底改变了我们每个人的生活&#x…

asp.net829家乡土特产销售网站#毕业设计

项目编号:asp.net829家乡土特产销售网站#毕业设计 运行环境&#xff1a;VSSQL 开发工具:VS2010及以上版本 数据库:SQL2008及以上版本 使用技术&#xff1a;HTMLJSHTML 开发语言&#xff1a;C#&#xff0c;框架&#xff1a;asp.net 基本每个地方都有自己的特产&#xff0c…

asp.net831手工制作方面的社交网站#毕业设计

项目编号:asp.net831手工制作方面的社交网站#毕业设计 运行环境&#xff1a;VSSQL 开发工具:VS2010及以上版本 数据库:SQL2008及以上版本 使用技术&#xff1a;HTMLJSHTML 开发语言&#xff1a;C#&#xff0c;框架&#xff1a;asp.net ​一直以来&#xff0c;都有很多的手…

asp.net824个人财务管理网站#毕业设计

项目编号:asp.net824个人财务管理网站#毕业设计 运行环境&#xff1a;VSSQL 开发工具:VS2010及以上版本 数据库:SQL2008及以上版本 使用技术&#xff1a;HTMLJSHTML 开发语言&#xff1a;C#&#xff0c;框架&#xff1a;asp.net 个人财务信息管理系统的开发目的是使个人财…

asp.net836护肤品评测网站#毕业设计

项目编号:asp.net836护肤品评测网站#毕业设计 运行环境&#xff1a;VSSQL 开发工具:VS2010及以上版本 数据库:SQL2008及以上版本 使用技术&#xff1a;HTMLJSHTML 开发语言&#xff1a;C#&#xff0c;框架&#xff1a;asp.net 越来越多的人接受了电子商务这种便捷、快速的…

asp.net838服装展示销售网站毕业设计

项目编号:asp.net838服装展示销售网站毕业设计 运行环境&#xff1a;VSSQL 开发工具:VS2010及以上版本 数据库:SQL2008及以上版本 使用技术&#xff1a;HTMLJSHTML 开发语言&#xff1a;C#&#xff0c;框架&#xff1a;asp.net 服装基本是每个人每一天都会接触到的东西&a…

asp.net843课程网站设计与开发#毕业设计

项目编号:asp.net843课程网站设计与开发#毕业设计 运行环境&#xff1a;VSSQL 开发工具:VS2010及以上版本 数据库:SQL2008及以上版本 使用技术&#xff1a;HTMLJSHTML 开发语言&#xff1a;C#&#xff0c;框架&#xff1a;asp.net 学习是人类进步的阶梯&#xff0c;只有不…

asp.net848化妆品销售网站#毕业设计

项目编号:asp.net848化妆品销售网站#毕业设计 运行环境&#xff1a;VSSQL 开发工具:VS2010及以上版本 数据库:SQL2008及以上版本 使用技术&#xff1a;HTMLJSHTML 开发语言&#xff1a;C#&#xff0c;框架&#xff1a;asp.net 化妆品基本是每一个女士每天都会使用到的一个…

python+djaongo的汉服文化交流网站汉服销售网站

开发语言:Python 开发工具:pycharm 数据库:MYSQL5.7 使用框架:djangovue 随着我国文化的不断复兴&#xff0c;很多文化元素也正在不断的出现在街头小巷之中&#xff0c; 其中汉服文化就是一个典型的代表&#xff0c;当前在很多拥有历史沉淀的景点&#xff0c;经常可以看到很多年…

Java+mysql基于SSM的公司办公网站OA系统#毕业设计

开发语言:Java 开发工具:IDEA /Eclipse 数据库:MYSQL5.7 应用服务:Tomcat7/Tomcat8 使用框架:ssm 随着我国经济的发展&#xff0c; 各类企业也在不断的增加&#xff0c;相应的办公的业务也在不断的增多&#xff0c;这就给日常的办公提出了新的要求&#xff0c;很明显传统的办公…

基于springboot+vue的电影视频订票咨询网站系统-Java项目毕业设计

项目介绍 随着网络不断的普及发展&#xff0c;影城管理系统依靠网络技术的支持得到了快速的发展&#xff0c;首先要从用户的实际需求出发&#xff0c;通过了解用户的需求开发出具有针对性的首页、电影信息、电影资讯、个人中心、后台管理、在线客服功能 影城管理系统的主要使用…

手搭我的世界基岩版服务器后台网站(LiteloaderBDS-SQLite-Spring Boot-Vue)Java后端+RESTful API;借助Three.js实现三维可视化展览交互界面

项目是刚刚完成的&#xff0c;于是趁热打铁把文档也写了。在这里分享出来&#xff0c;也方便以后回顾 目录 项目介绍 整体设计架构图 网站界面预览图 技术选型和原因 搭建步骤 库表设计 插件说明 后端说明 前端说明 部署说明 完整代码 插件代码 后端代码 前端代…

基于Python+django的茶叶销售商城网站

开发语言&#xff1a;Python 编号&#xff1a;py215-基于Python的茶叶销售商城网站 python框架&#xff1a;django 软件版本&#xff1a;python3.7/python3.8 数据库&#xff1a;mysql 5.7或更高版本 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;PyCharm/vs code 前端…

基于Python+django的宠物销售商城网站#毕业设计

开发语言&#xff1a;Python 编号&#xff1a;py216-基于Python的宠物销售商城网站 python框架&#xff1a;django 软件版本&#xff1a;python3.7/python3.8 数据库&#xff1a;mysql 5.7或更高版本 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;PyCharm/vs code 前端…

py217-基于Python+django的服装销售商城网站#毕业设计

开发语言&#xff1a;Python 编号&#xff1a;py217-基于Python的服装销售商城网站 python框架&#xff1a;django 软件版本&#xff1a;python3.7/python3.8 数据库&#xff1a;mysql 5.7或更高版本 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;PyCharm/vs code 前端…

py218-基于Python+django的化妆品美妆销售商城网站#毕业设计

开发语言&#xff1a;Python 编号&#xff1a;py218-基于Python的化妆品销售商城网站 python框架&#xff1a;django 软件版本&#xff1a;python3.7/python3.8 数据库&#xff1a;mysql 5.7或更高版本 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;PyCharm/vs code 前…

py218-基于Python+django的零食销售商城网站#毕业设计

开发语言&#xff1a;Python 编号&#xff1a;py218-基于Pythondjango的零食销售商城网站#毕业设计 python框架&#xff1a;django 软件版本&#xff1a;python3.7/python3.8 数据库&#xff1a;mysql 5.7或更高版本 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;PyCh…

py218-基于Python+django的鲜花销售商城网站#毕业设计

开发语言&#xff1a;Python 编号&#xff1a;py218-基于Pythondjango的鲜花销售商城网站#毕业设计 python框架&#xff1a;django 软件版本&#xff1a;python3.7/python3.8 数据库&#xff1a;mysql 5.7或更高版本 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;PyCh…