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

news/2024/5/10 1:41:39/文章来源:https://blog.csdn.net/weixin_42565865/article/details/117806549

往期

Flutter Web网站搭建教程

Flutter Web 网站之主页框架搭建

Flutter Web网站之Jetpack成型

Flutter Web网站之ScrollView+GridView优化

上期回顾

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

第一 暗黑主题越来越刚需化,现在哪个主流App没有暗黑都不好意思上架,而ios阵营更加强硬的要求平台实现,否则下架,库克牛逼,我们惹不起。

第二 项目还处于初期,这个时候重构改动成本较低

第三 主题的变更网上有很多框架可以快速实现,但我想寻求的是最简单的实现,不想引入别人的框架,一来自己了如指掌,二来不用依赖别人的升级来满足未来奇葩的需求。

这期实现其实很简单,来往下看。

实现效果

大屏浅色

大屏暗黑

小屏浅色9ba24884af6eef67975f4495db80b513.png

小屏暗黑9cc9da5ed91b2bb8cb61d6be29c6ae69.png

代码实现

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

class AppTheme {

ThemeData themeData;

AppTheme(this.themeData);

// ignore: non_constant_identifier_names

static final AppTheme DARK_THEME = AppTheme(ThemeData.dark());

// ignore: non_constant_identifier_names

static final AppTheme LIGHT_THEME = AppTheme(

ThemeData(brightness: Brightness.light, primaryColor: Colors.grey[50]));

}

复制代码

DARK_THEME暗黑主题

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

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

class ThemeBloc {

// ignore: close_sinks

final _themeStreamController = StreamController();

/// 变更主题调用方法

get changeTheTheme => _themeStreamController.sink.add;

/// 主题数据

get themeData => _themeStreamController.stream;

}

final bloc = ThemeBloc();

复制代码

给原来的MaterialApp包一层StreamBuilder

StreamBuilder(

initialData: AppTheme.LIGHT_THEME,

stream: bloc.themeData,

builder: (context, AsyncSnapshot snapshot) {

return MaterialApp(

title: 'Jetpack',

theme: snapshot.data.themeData,

home: PageHome(),

routes: {

"/qq": (context) => PageQQLink(),

"/pageChatGroup": (context) => PageChatGroup(),

},

);

})

复制代码

initialData 默认数据

stream 将bloc.themeData赋值给它,用来监听数据变化

snapshot 数据变化的快照,最终交给MaterialApp的theme,从而实现动态变更。如何触发变更数据呢?b877990c613d69379679992dd18ac0f1.png

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

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内容。

博客,这里考虑到有很多优秀的大佬,写过相关技术博客,帮你寻找最优秀的资源。功能设计如下图新增按钮。a9cf9e2a512bc9c039e4db96f06c4031.png

结束

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

b739ec46bb5c46d9c0aa4ce35ba1ea56.png

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[Flutter Web网站之最简方式实现暗黑主题无缝切换]http://www.zyiz.net/tech/detail-134123.html

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

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

相关文章

阿里云系列——3.企业网站备案步骤---2018-1-4

网站部署之~阿里云系列汇总 http://www.cnblogs.com/dunitian/p/4958462.html 个人网站备案:http://www.cnblogs.com/dunitian/p/4958268.html 先说企业的域名实名认证:一张图就ok了 说下步骤,其实和个人差不多,简单过下吧 1.填写…

java网络编程基础夯实03-为什么不能直接通过IP访问网站

在java网络编程基础夯实02-InetAddress类一文中通过getAllByName得到了www.csdn.net对应的四个IP地址。从理论上说,在IE(或其他的Web浏览器,如Firefox)的地址栏中输入这四个IP地址中的任何一个,都可能访问www.csdn.net。如输入htt…

Linux中使用Apache服务部署静态网站及配置介绍

在介绍Apache服务之前,先了解一下Web网络服务和其他两个服务。 配置文件 /etc/httpd/conf/httpd.conf 参数 部署Apache服务 [rootapache-server ~]# yum install httpd.x86_64 httpd-manual -y 安装服务 [rootapache-server ~]# systemctl start httpd 启动服务 [r…

网市场云建站 v4.8 增加私有模版库,开放 Mysql 配置、在线客服源码

百度智能云 云生态狂欢季 热门云产品1折起>>> 网市场云建站系统,结合各种产品,将一个网站的服务器成本降低到0.1元!打破传统建站的高成本,让价格不再是阻碍的门槛,让每个人都能有自己的网站! 延…

《WEB开发-阿里云建站》第1章 建站前的准备

1.1 阿里云ECS服务器建站概述 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可以干很多事情,建站只是一小部分功能,关于更加具体的内容请参看阿里云官网。 https://www.aliyun.com/ 图1阿里云EC…

《WEB开发- Web服务器环境搭建》使用花生壳+II7搭建网站服务

1简介 IIS7及以上版本提供的请求-处理架构包括以下内容:  Windows Process Activation Service(WAS)可以让站点支持更多协议,不仅仅是HTTP和HTTPS;  可以通过增加或移除模块来自定义Web服务器引擎;  集成IIS和ASP.NET请求-…

《WEB开发-阿里云建站》第1章 建站前的准备(安装Linux服务器管理工具-宝塔)

这篇博客主要是安装Linux服务器管理工具-宝塔,关于阿里云的购买,域名注册备案,以及WDCP的安装请看我的这篇博客。 点击进入 1.4安装Linux服务器管理工具-宝塔 笔者的阿里云使用的Ubuntu16.04。 环境要求:  操作系统&#xf…

今天和大家分享几个可以接私活的网站(偏软件)(转载21ic)

关于程序员接私活,社会各界说法不一。按照作者的观点来说如果你确实急用钱,价格又合适,那就去做。如果不怎么缺钱,那就接私活之前要好好考虑。私活的钱不好挣是一个方面,更重要的是如果你把做私活的时间花在提升自己上…

ashx文件 验证是否登录_如何在百度站长平台验证网站?

如何在百度站长平台验证网站,验证网站都会遇到哪些坑,通过这篇文章让大家详细的了解一下如何验证网站,希望能帮助到更多小伙伴。那么多人都在使用百度站长平台,可是依然有大部分人不知道如何正确使用百度站长平台工具,…

我的家乡网站模板_韩国留学之 学业计划书amp;自我介绍怎么写?(附模板)

大家好,今天小雯来讲讲韩国留学之申请材料那点事儿~最近,有很多同学来找小雯咨询学习计划书的范文,好像对留学资料无从下手,其实,看似很难的学习计划书和自我介绍,一点都不难。如果学校提供模板就按学校模板…

一个好玩的网站http://patorjk.com/

这是一个特别万能的工具 输入网址: http://patorjk.com/ 将会出现这个: 这里可以做的东西简直太多了! Apps: Visualizations: Games and Misc: 功能众多, 1.我们可以做springboot 的banner自定义, 感觉…

restful接口开发实例_广州开发区网站

广州开发区网站学生荣获第46届世界技能大赛武汉选拔赛一等奖2项、二等奖3项大数据技术与应用主干课程:计算机网络技术、数据库技术应用MySQLs Python程序设计、Linux操作系统、Java程序设计工程数学、数据预处理、数据分析及应用、数据可视化、Hadoopx数据采集与网络…

npm 如何卸载swiper_如何快速搭建个人网站?

作者 l 白色蜗牛来源 l 蜗牛互联网(ID: woniu_internet)转载请联系授权(微信ID: 919201148)近期精彩文章:福利!iPhone 256G免费送前言建网站本身是一个很大的工程,涉及前端页面的搭建,网站数据的存储,还要购置服务器资…

如何用oracle分析网站,使用外部表分析eygle.com的网站访问日志

使用外部表分析eygle.com的网站访问日志经过使用Oracle的外部表对Oracle的警告日志文件、跟踪文件进行获取和分析之后,我发现外部表实在是非常易用,甚至到了随心所欲的境地(当然外部表尚不能修改外部文件)。使用外部表可以很容易的实现网站的访问日志分析…

modelandview跳转页面404_超快排:在百度搜索引擎网站404页面怎么做?

我们平时在百度搜索引擎网站的时候遇到过打开之后是错误页面,这些页面有提示可以返回之前页面和首页。为什么网站会有这样的页面呢?这是因为网站设置了404页面。我们在做百度搜索引擎SEO排名优化的时候,往往只注意网站结构专注与如何排名提高…

asp.net网站作为websocket服务端的应用该如何写

最近被websocket的一个问题困扰了很久,有一个需求是在web网站中搭建websocket服务。客户端通过网页与服务器建立连接,然后服务器根据ip给客户端网页发送信息。 其实,这个需求并不难,只是刚开始对websocket的内容不太了解。上网搜索…

java web 社区_我的第一个javaweb----模仿社区网站(二)

项目分层在写后台之前我给分了四层,每一层负责不同的功能,如图. 前端页面层:也就是浏览器展示给人看的,直接与人交互的界面. servlet层:受理前端页面发来的数据,由它接受前端发来的请求(request)做出不同的…

老榕智能建站软件_教你把网站建设得更好上线了智能建站系统

对于不懂技术、没有太多资金的个人和中小企业来说,要想生成自己的网站,就需要用到智能建站系统。智能建站比较简单,小白也能很快上手,不过这并不意味着你就可以随随便便搭建了。实际上,若想顺利建设出一个有用的网站&a…

vba获取正在运行网站的源码_VBA教程连载——第三节:如何运行宏

宏的运行方式有以下几种:第一种,自我录制运行打开开发工具-自己去录制一个宏,然后给它命名,录制完成后运行。至于具体怎么录制,我们下节课再细谈。注意:内置宏的表格,一般是没法直接保存的&…

html seo 优化,SEO优化中常见的四种html标签作用

对于SEOer来说,在HTML代码中,使用一些标签,更利于搜索引擎蜘蛛的读取,适当布局一些优化标签,可能会有意想不到的结果。下面就列举几个标签的妙用。1.标题标签。在网页html代码中 h1 标签是定义最大的标题。在整个页面中…