Flutter适配深色模式(DarkMode),含泪整理面经

///

/// If [button] is not [MaterialButton.enabled], the value of
/// [getDisabledTextColor] is returned. If the button is enabled and
/// [buttonTextColor] is non-null, then [buttonTextColor] is returned.
///
/// Otherwise the text color depends on the value of [getTextTheme]
/// and [getBrightness].
///
/// * [ButtonTextTheme.normal]: [Colors.white] is used if [getBrightness]
/// resolves to [Brightness.dark]. [Colors.black87] is used if
/// [getBrightness] resolves to [Brightness.light].
/// * [ButtonTextTheme.accent]: [colorScheme.secondary].
/// * [ButtonTextTheme.primary]: If [getFillColor] is dark then [Colors.white],
/// otherwise if [button] is a [FlatButton] or an [OutlineButton] then
/// [colorScheme.primary], otherwise [Colors.black].
Color getTextColor(MaterialButton button) {
if (!button.enabled)
return getDisabledTextColor(button);

if (button.textColor != null)
  return button.textColor;

switch (getTextTheme(button)) {
  case ButtonTextTheme.normal:
    return getBrightness(button) == Brightness.dark ? Colors.white : Colors.black87;

  case ButtonTextTheme.accent:
    return colorScheme.secondary;

  case ButtonTextTheme.primary: {
    final Color fillColor = getFillColor(button);
    final bool fillIsDark = fillColor != null
      ? ThemeData.estimateBrightnessForColor(fillColor) == Brightness.dark
      : getBrightness(button) == Brightness.dark;
    if (fillIsDark)
      return Colors.white;
    if (button is FlatButton || button is OutlineButton)
      return colorScheme.primary;
    return Colors.black;
  }
}

assert(false);
return null;

}


* * *

2020.01.01 补充:

如果启动页需要适配的话,要考虑应用启动时短暂的白屏现象。(比如启动时白屏,启动页为黑色背景,这样会不和谐)最优的方式是使用Android、iOS原生的方式处理应用启动与启动页的过渡。

这里我介绍一下简易版的方式:

Android端:

`android -> app -> src -> main -> res` 目录下新建 `drawable-night` 文件夹,添加`launch_background.xml`文件。

<?xml version="1.0" encoding="utf-8"?> <-- 具体的颜色色值 ```

这样在深色模式下,会使用对应的颜色背景。(当然要保证你的默认样式使用到了此文件)

iOS端:

修改BackgroundSystem Background Color

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WAiNjUzR-1631253281447)(https://user-gold-cdn.xitu.io/2020/1/1/16f607ca98abf2dd?imageView2/0/w/1280/h/960/ignore-error/1)]

具体的代码示例[点击查看](

)

3.功能拓展

如果你适配好了深色模式,其实可以稍微拓展一下这个功能。我想到了微信中的多语言功能,在多语言这类功能中,默认选项是“跟随系统”,当然你也可以指定某种语言。

按照这个思路我在设置中添加了“夜间模式”的功能,默认也是跟随系统,当然你也可以手动的开启和关闭。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q3mqNI1K-1631253281449)(https://user-gold-cdn.xitu.io/2019/10/14/16dc7a28ef90a362?imageslim)]

这里暂时有个问题,在iOS手机上开启深色模式,当我应用内关闭深色模式后,[状态栏文字无法变为黑色](

)。

问题主要还是Flutter 1.9.1的版本并没有适配iOS 13 Status Bar增的UIStatusBarStyleDarkContent

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fxZReRcQ-1631253281450)(https://user-gold-cdn.xitu.io/2019/10/14/16dc8a87d20e8fd7?imageView2/0/w/1280/h/960/ignore-error/1)]

这个问题Flutter的issues中也有人反馈了,期待官方的适配修复吧。

上述这些,基本就是适配深色模式主要内容了。本身没有什么复杂的,主是是个细心活。

说了这么多,最后放几张适配的效果图给大家看看:

|
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vTKrykYh-1631253281452)(https://user-gold-cdn.xitu.io/2019/10/14/16dc7a28ef77e726?imageView2/0/w/1280/h/960/ignore-error/1)]

|

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yu04q93O-1631253281454)(https://user-gold-cdn.xitu.io/2019/10/14/16dc7a28f320250b?imageView2/0/w/1280/h/960/ignore-error/1)]

|

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-82Cwd5W5-1631253281455)(https://user-gold-cdn.xitu.io/2019/10/14/16dc7a28f3bb6d0f?imageView2/0/w/1280/h/960/ignore-error/1)]

|

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Kr6JqSLt-1631253281456)(https://user-gold-cdn.xitu.io/2019/10/14/16dc7a28f3c6ead3?imageView2/0/w/1280/h/960/ignore-error/1)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nY0N1RM6-1631253281457)(https://user-gold-cdn.xitu.io/2019/10/14/16dc7a2919051b14?imageView2/0/w/1280/h/960/ignore-error/1)]

|

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2uAE8YT3-1631253281457)(https://user-gold-cdn.xitu.io/2019/10/14/16dc7a291df8c11a?imageView2/0/w/1280/h/960/ignore-error/1)]

|

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DQbFk1eJ-1631253281458)(https://user-gold-cdn.xitu.io/2019/10/14/16dc7a291d357cf3?imageView2/0/w/1280/h/960/ignore-error/1)]

|

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ztb9nZAk-1631253281459)(https://user-gold-cdn.xitu.io/2019/10/14/16dc7a291d6e6fa9?imageView2/0/w/1280/h/960/ignore-error/1)]

|

详细的代码以及实现细节,可以参看[flutter_deer](

)的代码。深色模式相关的设计图也已经同步更新了。最后希望可以点赞支持一波!!!

最后

今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。

最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司20年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

**[CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》](

)**

【Android核心高级技术PDF文档,BAT大厂面试真题解析】

Flutter适配深色模式(DarkMode),含泪整理面经

【算法合集】

Flutter适配深色模式(DarkMode),含泪整理面经

【延伸Android必备知识点】

Flutter适配深色模式(DarkMode),含泪整理面经

本文已被腾讯CODING开源托管项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录,自学资源及系列文章持续更新中…
点】**

[外链图片转存中…(img-CQ6STz0p-1631253281461)]

本文已被腾讯CODING开源托管项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录,自学资源及系列文章持续更新中…

上一篇:总结Linux常用命令使用格式,并用实例说明。例如echo、screen、date、ifconfig、export等命令


下一篇:使用matplotlib和pygal实现数据可视化。